【问题标题】:Lost update occured in serializable isolation level?可序列化隔离级别发生更新丢失?
【发布时间】:2023-03-04 00:47:01
【问题描述】:

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

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

【问题讨论】:

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

标签: sql sql-server tsql transactions isolation-level


【解决方案1】:

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

From the docs:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2022-09-27
    • 2019-05-02
    • 2012-01-02
    • 1970-01-01
    • 2020-07-16
    • 2015-03-24
    相关资源
    最近更新 更多