Rollback在并发环境中意味着什么?

时间:2013-09-09 11:10:09

标签: sql-server tsql concurrency transactions rollback

这个问题是关于T-SQL / SQL Server的。

假设我们有一个事务将一些行X1插入表X,更新表X中的行X2,然后发出回滚。

在回滚之前,第二个事务更新表X中的行X1和X2并提交。 (我想,为了更新X1,该事务必须具有隔离级别Read Uncommitted。)

第一次事务回滚后行X1和X2的状态是什么?

1 个答案:

答案 0 :(得分:3)

您无法在第二个交易中更新X1和X2。无论指定的事务级别如何,任何写入操作都会执行独占(X)锁定。这正是为了防止问题中的场景并保证每个事务的ACID属性。

如果指定“read uncommitted”,您唯一能做的就是从第一个事务中读取更改的值。您会看到新记录X1和修改后的记录X2,因为“read uncommitted”不会读取锁定,因此会忽略第一个事务中放置的X-Lock。但是,修改这些值仍然需要你自己的X-Locks,在事务1完成之前你不会得到它。

编辑:如果您想探索SQL Server中的锁定行为,我建议您打开一个探查器会话,选择“TSQL_Locks”模板,添加“Lock:Acquired”和“Lock:Released”事件并过滤事件基于您的SPID(Management Studio会话选项卡中的括号中的数字,通常为51或更高)。

然后在具有不同隔离级别的简单表上触发一些读写语句,看看会发生什么。重要的列是“EventClass”,“Mode”,“ObjectId”,“TextData”和“Type”。如果yiu第一次发送语句,则会获得与编译语句相关联的大量模式锁。只需再次发出相同的声明,就可以更清楚地了解重要的锁。