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

写了一篇文章系统的梳理了下事务的隔离级别,希望能对初学者有所帮助

  •  1
     
  •   qingtengmuniao · 2022-07-06 10:36:19 +08:00 · 1950 次点击
    这是一个创建于 869 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,最近在搞 DDIA 第七章事务的分享,花了很长时间,但收获也是蛮大。对于事务中最难的部分——隔离级别由一知半解到初窥门径。最后以一篇文章作为小结,希望对大家有所帮助。

    另外,如果大家对 DDIA 感兴趣,可以一起来参加分享会

    最后,不当之处,欢迎大家拍砖指正。

    18 条回复    2022-07-07 13:56:16 +08:00
    dqzcwxb
        1
    dqzcwxb  
       2022-07-06 10:40:47 +08:00
    说句题外话,不是针对贴主

    不建议新手过多的在单机事务上折腾,复杂又晦涩难懂而且无法解决跨库问题
    而跨库问题是分布式项目必须要考虑的,当然如果你觉得单机是未来而分布式不是,那当我在放屁
    anthow
        2
    anthow  
       2022-07-06 10:41:27 +08:00 via Android
    关注了,这本书拖了好久都没看完
    cheng6563
        3
    cheng6563  
       2022-07-06 10:42:31 +08:00   ❤️ 2
    @dqzcwxb 单机事务都搞不定搞个锤的跨库事务
    dqzcwxb
        4
    dqzcwxb  
       2022-07-06 10:48:03 +08:00
    @cheng6563 常用的 TCC 模式不依赖于单机事务
    nothingistrue
        5
    nothingistrue  
       2022-07-06 11:06:31 +08:00   ❤️ 2
    @dqzcwxb #1 跨库事务或者分布式事务从来都是伪命题,最后都要放弃事务一致性改成最终一致性。而最终一致性的前提是单节点上的事务一致性。至于你说的 TCC 模式,虽然我是第一次听说,但随便一搜就能确定它在单节点上还是事务一致性。
    nothingistrue
        6
    nothingistrue  
       2022-07-06 11:14:58 +08:00
    @dqzcwxb 给你补充一下,TCC 模式是不依赖于本地关系数据库的 ACID 事务,但人家可没说不要求本地事务,你要不用关系数据库的事务,就得自己参照 ACID 原则做本地事务。
    dqzcwxb
        7
    dqzcwxb  
       2022-07-06 11:17:12 +08:00

    @nothingistrue #6 既然是第一次听说,就不要编造一些没有的东西
    nothingistrue
        8
    nothingistrue  
       2022-07-06 11:20:31 +08:00
    @dqzcwxb 你的文字理解能力实在是有限
    dqzcwxb
        9
    dqzcwxb  
       2022-07-06 11:24:15 +08:00
    @nothingistrue #8 "当然如果你觉得单机是未来而分布式不是,那当我在放屁"
    chendy
        10
    chendy  
       2022-07-06 11:26:39 +08:00
    @dqzcwxb
    单机事务满足需求的话,就不需要分布式事务了
    单机事务都不能保证,分布式事务也不能保证
    打好基础不是坏事
    dqzcwxb
        11
    dqzcwxb  
       2022-07-06 11:29:42 +08:00
    @chendy #10
    "单机事务满足需求的话,就不需要分布式事务了" 这里你应该指的是数据库事务,因为不会有人第一步学习非数据库事务
    "单机事务都不能保证,分布式事务也不能保证" 这里你又变成了真正的单机事务,即包含常规的关系型数据库和其他

    实际上我的想法是说不要去折腾单机事务,直接从分布式事务考虑即可因为分布式事务包含单机事务而且不会让你局限于某个数据库事务
    CRVV
        12
    CRVV  
       2022-07-06 11:39:40 +08:00
    @dqzcwxb

    > 常用的 TCC 模式不依赖于单机事务

    能不能讲解一下,try 的那个步骤结束以后,现在需要 confirm 或者 cancel 了,怎么实现?
    如果用数据库的事务,当然就是 commit 和 rollback 。

    怎么样可以“不依赖于单机事务” 来实现 confirm 和 cancel ?
    nothingistrue
        13
    nothingistrue  
       2022-07-06 11:41:24 +08:00   ❤️ 1
    @dqzcwxb 没先搞明白事务,就直接上分布式事务,就容易出现你这种理解偏差(说直白点就是没学会走就去学跑)。分布式事务的目的是什么,是要保证分布式场景下的数据一致性,那如果分布式流程中的单个环节都无法保证一致性的话,总体场景怎么可能有一致性。

    不光 TCC ,除了两阶段提交之外的大部分分布式最终一致性方案,在分布式流程环节,都不依赖数据库。那实际上就不需要明说,都特么跨数据库了,还怎么依赖数据库。而那只是分布式流程环节不依赖数据库,单节点内部,还是需要强一致性的,而强一致性最好的方案就是关系数据库。单节点环节内部需要强一致性,这点也是不需要明说,因为通常能接触到最终一致性方案的,不会是像你这样事务一致性都不懂的人。
    CRVV
        14
    CRVV  
       2022-07-06 12:06:35 +08:00
    看了楼主的最后的“小结文章”,大概提一个问题。

    isolation level 是数据库的接口,而锁是数据库的实现,实现和接口没有必然的联系。
    当然 isolation level 这个接口不太好理解,用实现方式来讲确实更简单了,每个事务都加一把大锁就是 serializable 的效果。
    但 serializable 的实现不一定要加一把大锁,比如 PostgreSQL 和 Oracle 。

    常见的这四个 isolation level 是 SQL standard 定义的,但是 SQL 这个东西根本没人在乎它的 standard ,每个数据库想怎么实现就怎么实现,所谓 snapshot isolation 只是 SQL Server 自己搞的而已。
    dqzcwxb
        15
    dqzcwxb  
       2022-07-06 12:29:33 +08:00
    @nothingistrue #13 你很懂啊,但是你却看不懂这句" 这里你应该指的是数据库事务,因为不会有人第一步学习非数据库事务"
    搞的好像新手第一步都懂的自己去实现非关系型数据库一样,我的意思很明了在目前分布式大大环境下没必要死磕单机事务各种隔离性在分布式事务里根本不需要,记住这里说的是学习成本和收益问题并不是否定单机事务
    你上来就是一顿批判,结果在此之前连 TCC 是什么都不知道
    你觉得你牛那就牛,你是对的
    version0
        16
    version0  
       2022-07-06 13:54:46 +08:00
    哇,谢谢大佬这么好的东西,大佬不用管评论下面的那些事,相信大家都是 “见多识广“ 了
    qingtengmuniao
        17
    qingtengmuniao  
    OP
       2022-07-06 18:17:17 +08:00
    @version0 感谢~
    qingtengmuniao
        18
    qingtengmuniao  
    OP
       2022-07-07 13:56:16 +08:00
    @dqzcwxb 其实实现隔离性的手段具有普遍性,它本质上是一种多个资源联动修改的并发问题的界定和解决,因此并不能说以后是分布式时代就过时了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1107 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:52 · PVG 06:52 · LAX 14:52 · JFK 17:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.