任务:
打开更新某些行并回滚的第一个事务(T1)(总是)
在同一时间(在打开 T1 之后但在回滚之前)其他事务 T2 可以修改相同的行并提交它
在这种情况下 T2 等待 T1(使用 READ_COMMITTED_SNAPSHOT 隔离级别)
可以不等待就完成吗?
示例:第一个查询窗口
IF NOT EXISTS ( SELECT *
FROM sysobjects
WHERE name = 'TestLockTable'
AND xtype = 'U' )
BEGIN
CREATE TABLE TestLockTable
(
Id INT NOT NULL ,
Name VARCHAR(64) NOT NULL
)
END
INSERT INTO dbo.TestLockTable
( Id, Name )
VALUES ( 1, 'test' )
BEGIN TRANSACTION T1
UPDATE dbo.TestLockTable
SET Name = 'test1'
WHERE Id = 1;
第二:
BEGIN TRANSACTION T2
SELECT *
FROM dbo.TestLockTable
WHERE Id = 1; --Select 'test' without wait
UPDATE dbo.TestLockTable
SET Name = 'test2'
WHERE Id = 1; --This T2 hang on
COMMIT TRANSACTION T2
最后:
ROLLBACK TRANSACTION T1
回滚 T1 后,T2 可以提交,我们在行中得到 'test2'