gpt4 book ai didi

sql-server - 回滚在并发环境中意味着什么?

转载 作者:行者123 更新时间:2023-12-04 04:42:23 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

如果您指定“读取未提交”,您唯一可以做的就是从第一个事务中读取更改的值。您会看到新记录 X1 和修改后的记录 X2,因为“未提交读”没有读锁,因此忽略了放置在第一个事务中的 X 锁。但是,修改这些值仍然需要您自己的 X-Lock,在事务 1 完成之前您将无法获得。

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

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

关于sql-server - 回滚在并发环境中意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18696905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com