任务:
打开更新某些行并回滚(始终)的第一个事务(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'在行
答案 0 :(得分:1)
所有DML总是采用X锁。这样可以可靠地执行回滚。没办法,这是引擎的核心原则。
您需要一种不同的方法。不管怎样,不建议使用带锁的异国情调的东西,因为它很难正确且难以测试。
在不知道你想要完成什么的情况下,我无法建议更好的选择。
答案 1 :(得分:0)
我们可以使用" with(nolock)"或" READ_COMMITTED_SNAPSHOT = false"但我们无法更新或删除没有独占锁的行..