我有一个具有这种结构的表:
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)