小编Ami*_*ari的帖子

开始事务不锁定表

我有一个具有这种结构的表:

CREATE TABLE [dbo].[a](
    [id] [INT] IDENTITY(1,1) NOT NULL,
    [aa] [INT] NULL,
 CONSTRAINT [PK_a] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

然后创建新事务,然后更新所有记录,但不要提交。所以我有这样的事情:

BEGIN TRANSACTION

UPDATE dbo.a
SET aa=4
Run Code Online (Sandbox Code Playgroud)

在新会话中,我执行选择并获得结果!并在更新前查看旧值。

SELECT * FROM a 
Run Code Online (Sandbox Code Playgroud)

当我想执行更新时,它会等待另一个事务提交。

我的问题是:

当我们在事务中更新一个表时,我们会在它上面创建一个锁,直到提交事务并且没有人可以从中选择,但为什么我可以呢?

我有 57 条记录,当我用这个检查 sql 上的锁定状态时:

SELECT resource_type, request_mode, resource_description
FROM sys.dm_tran_locks
WHERE resource_type <> 'DATABASE'
Run Code Online (Sandbox Code Playgroud)

我得到这样的结果:

resource_type         request_mode          resource_description
------------------- ------------------- ------------------- 
OBJECT                IX …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2016

3
推荐指数
1
解决办法
996
查看次数

标签 统计

sql-server ×1

sql-server-2016 ×1