【问题标题】:SQL: at REPEATABLE READ isolation level, are UPDATE locks held to the end of the transaction?SQL:在 REPEATABLE READ 隔离级别,UPDATE 锁是否保持到事务结束?
【发布时间】:2011-08-23 10:09:24
【问题描述】:
我have read 关于 REPEATABLE READ 如何导致 SELECT 语句持有的锁被持有到事务结束。 UPDATE 语句采用的独占锁是否也是如此?因此,当我在事务中更新一行时,是否会出现后续 SELECT 将返回 UPDATE 留下的值的情况?
所以我知道,如果我在事务 1 中选择一行,那么事务 2 在事务 1 完成之前无法更新它。但是,如果我 UPDATE 事务 1 中的行,那么事务 2 是否还需要等待事务 1 完成,然后事务 2 才能 UPDATE 呢?
【问题讨论】:
标签:
sql
transactions
isolation-level
【解决方案1】:
除非第二个事务在隔离级别 READ UNCOMMITED 运行,否则第一个事务中的 UPDATE 语句采用的排他锁将阻止任何选择,直到第一个事务提交。
所以我知道如果我在事务 1 中选择一行,那么
在事务 1 完成之前,事务 2 无法更新它。然而,
如果我更新事务 1 中的行,事务 2 仍然必须
等待事务 1 完成,事务 2 才能更新它?
是的。
如果在 REPEATABLE READ 下,您在事务 1 中执行了 SELECT,事务 2 仍然可以在事务 1 中添加与 SELECT 的 WHERE 子句匹配的新数据。这是因为事务 1 放置了行读取锁定所有检索到的数据,但不锁定范围锁定。