2

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

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

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

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

4

1 回答 1

3

您不能在第二个事务中更新 X1 和 X2。无论指定的事务级别如何,任何写操作都需要独占 (X) 锁。这正是为了防止您的问题中出现这种情况并保证每个事务的ACID属性。

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

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

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

于 2013-09-09T15:09:01.937 回答