没有写锁定的更新

时间:2015-05-25 07:06:23

标签: sql sql-server transactions locking read-committed-snapshot

任务:

打开更新某些行并回滚(始终)的第一个事务(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'在行

2 个答案:

答案 0 :(得分:1)

所有DML总是采用X锁。这样可以可靠地执行回滚。没办法,这是引擎的核心原则。

您需要一种不同的方法。不管怎样,不建议使用带锁的异国情调的东西,因为它很难正确且难以测试。

在不知道你想要完成什么的情况下,我无法建议更好的选择。

答案 1 :(得分:0)

我们可以使用" with(nolock)"或" READ_COMMITTED_SNAPSHOT = false"但我们无法更新或删除没有独占锁的行..