V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zxCoder
V2EX  ›  数据库

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

  •  
  •   zxCoder · 2021-03-11 11:30:03 +08:00 · 1606 次点击
    这是一个创建于 1113 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    不过纠结一个事实上不存在的操作意义不大, 关注下脏读的条件还有点用.
    zxCoder
        4
    zxCoder  
    OP
       2021-03-11 12:32:38 +08:00
    @monsterxx03 知道了 谢谢
    v2exblog
        5
    v2exblog  
       2021-03-11 16:42:42 +08:00
    @monsterxx03 我也想问问脏读是什么鬼,现在开发的项目,一直没遇到过这种问题
    monsterxx03
        6
    monsterxx03  
       2021-03-11 16:48:47 +08:00
    @v2exblog 只谈 MySQL 的话, 默认配置下也不会发生有脏读, 除非自己把 isolation level 设置成 read uncomitted. 完整解释很麻烦, 看看 isolation level 相关的文章吧.
    pedia
        7
    pedia  
       2021-03-14 18:15:50 +08:00
    @zxCoder MySQL 不存在脏写,因为采用 2PL 加锁机制, 所以你说的情况不会发生。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2999 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 14:46 · PVG 22:46 · LAX 07:46 · JFK 10:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.