没有写锁的更新



任务:

打开第一个事务(T1),更新一些行并回滚(always)

在同一时间(在open 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'

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

你需要一个不同的方法。无论如何,不建议使用锁做一些奇怪的事情,因为很难正确操作,也很难测试。

在不知道你想要达到什么目标的情况下,我无法提出更好的建议。

我们可以使用"with (nolock)"或"READ_COMMITTED_SNAPSHOT = false"读取没有等待的行,但是我们不能更新或删除没有排他锁的行

相关内容

  • 没有找到相关文章

最新更新