zxCoder
V2EX  ›  数据库

关于数据库的“脏写”定义

  •  
  •   zxCoder · Mar 11, 2021 · 2326 views
    This topic created in 1921 days ago, the information mentioned may be changed or developed.

    书上说的是"一个事务修改了另一个未提交事务修改过的数据",然后几乎全网举的都是同一个例子,就是两个事务修改了数据,还没提交,然后其中一个事务回滚,另一个事务提交,提交的这个事务其实数据也被回滚了。

    我的问题是必须是有回滚才会导致脏写吗?比如我两个事务修改了同一个数据,一个先提交,然后另一个再提交,这算脏写吗?

    7 replies    2021-03-14 18:15:50 +08:00
    monsterxx03
        1
    monsterxx03  
       Mar 11, 2021
    满足 ACID 的 RDBMS 就不会有脏写, 你说的那个例子, 如果修改的是同一条数据, update 会上 exclusive lock, 第二次 update 会直接停在那, 第一次 update rollback, 第二次 update commit, 不会 roll back.
    zxCoder
        2
    zxCoder  
    OP
       Mar 11, 2021
    @monsterxx03 额 其实我想问的是脏写的定义
    monsterxx03
        3
    monsterxx03  
       Mar 11, 2021
    额, 一定要说定义的话, 第二个例子里, 如果第二次提交后最终结果是第一次的结果, 那应该算脏写.

    不过纠结一个事实上不存在的操作意义不大, 关注下脏读的条件还有点用.
    zxCoder
        4
    zxCoder  
    OP
       Mar 11, 2021
    @monsterxx03 知道了 谢谢
    joApioVVx4M4X6Rf
        5
    joApioVVx4M4X6Rf  
       Mar 11, 2021
    @monsterxx03 我也想问问脏读是什么鬼,现在开发的项目,一直没遇到过这种问题
    monsterxx03
        6
    monsterxx03  
       Mar 11, 2021
    @v2exblog 只谈 MySQL 的话, 默认配置下也不会发生有脏读, 除非自己把 isolation level 设置成 read uncomitted. 完整解释很麻烦, 看看 isolation level 相关的文章吧.
    pedia
        7
    pedia  
       Mar 14, 2021
    @zxCoder MySQL 不存在脏写,因为采用 2PL 加锁机制, 所以你说的情况不会发生。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2968 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 14:39 · PVG 22:39 · LAX 07:39 · JFK 10:39
    ♥ Do have faith in what you're doing.