可序列化隔离级别发生更新丢失?

Posted

技术标签:

【中文标题】可序列化隔离级别发生更新丢失?【英文标题】:Lost update occured in serializable isolation level? 【发布时间】:2019-01-08 05:30:44 【问题描述】:

最近我一直在学习 sql server 的隔离级别。在观看其中一个教程时,我注意到一些奇怪的东西,我不明白。 我被告知在可序列化隔离级别中没有丢失更新,但在 2:30 提交第一个事务后没有丢失更新?:https://www.youtube.com/watch?v=9NVu17LjPSA&list=PL08903FB7ACA1C2FB&index=75

请解释一下刚才发生了什么

【问题讨论】:

您在哪里看到丢失的更新?第一个事务提交 5,第二个事务被选中 5。一切都很好。 好吧,我的错,但如果这不是在第二个事务中选择,但更新它仍然会执行并丢失更新 不正确的@Rocket128 如果事务 2 是更新语句,则在事务 1 完成之前不会更新。 【参考方案1】:

相关视频解释说,执行更新(事务 1)时,并未提交。但是,由于事务隔离级别是可序列化的,因此在事务 2 中对同一条记录的读取在释放锁之前无法读取该值。因此,事务 2 当前被事务 1 阻塞。当事务 1 提交时,锁被释放,然后事务 2 可以获得可序列化隔离所需的锁。

From the docs:

语句无法读取已被其他事务修改但尚未提交的数据。

在当前事务完成之前,没有其他事务可以修改当前事务已读取的数据。

其他事务无法插入带有键值的新行 落在当前任何语句读取的键范围内 交易直到当前交易完成。

更有趣的是,如果您认为可序列化隔离意味着事务仅在前一个事务完成后执行。 Paul White blogs on this in great detail.

【讨论】:

以上是关于可序列化隔离级别发生更新丢失?的主要内容,如果未能解决你的问题,请参考以下文章

Mysql在可重复读事务隔离级别下怎么解决幻读的

浅析SQL Server在可序列化隔离级别下,防止幻读的范围锁的锁定问题

数据库的事务隔离级别

隔离级别与丢失更新

小白知识:事务+ACID+更新丢失+脏读+幻读+隔离级别+锁

数据库事务隔离级别 一般用哪个