2011-08-23 60 views
2

I have read关于REPEATABLE READ如何导致SELECT语句持有的锁保持在事务结束时。对UPDATE语句采用的排它锁也是如此?因此,当我在一个事务中更新一行时,后续的SELECT会返回UPDATE留下的值吗?SQL:在REPEATABLE READ隔离级别,UPDATE锁是否保存到事务结束?

所以我明白,如果我在事务1中选择一行,那么在事务1完成之前,事务2不能更新它。但是,如果我更新事务1中的行,事务2是否仍然必须等待事务1完成才能将事务2更新?

回答

4

除非第二个事务在隔离级别READ UNCOMMITED中运行,否则UPDATE语句在第一个事务中采用的排它锁将阻止任何选择,直到第一个事务提交。

所以我明白,如果我在事务1中选择一行,然后 事务2不能更新它,直到事务1完成。但是,如果我更新了事务1中的行,则事务2仍然需要 等待事务1在事务2可以更新之前完成吗?

是的。

如果在REPEATABLE READ下执行事务1中的SELECT,事务2仍然可以添加与事务1中的SELECT的WHERE子句相匹配的新数据。这是因为事务1将所有检索到的行读取锁数据但不是范围锁定。