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

分布式事务到是什么

  •  
  •   Saber299 · 89 天前 · 3660 次点击
    这是一个创建于 89 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天面试了一家外包公司,被问到分布式事务场景,我回答系统对接和微服务应用之间业务数据同步,直接被面试官打断结束面试了,想问下大家分布式事务是什么?

    37 条回复    2024-08-23 16:08:10 +08:00
    csys
        1
    csys  
       89 天前   ❤️ 1
    CAP ,共识算法,最终一致性,状态同步,补偿机制,SAGA
    具体是什么取决于面试方想要听到什么,广义的狭义的,过去的现在的,都不一样
    但是总之就是通过各种手段在分布式环境下确保“正确”
    Saber299
        2
    Saber299  
    OP
       89 天前 via iPhone
    @csys 我理解的出现分布式事务问题是两个系统或者两个应用之间不在同一个事务导致的,使用的解决方案也都是基于异步调用,像 mq 、定时任务重试或者人工干预这些,你说的这些我只理解了最终一致性……
    acrisliu
        3
    acrisliu  
       89 天前   ❤️ 3
    https://pdai.tech/md/arch/arch-z-transection.html
    不知道楼主面试的是什么岗位,这些八股文还是多准备下比较好
    poltao
        4
    poltao  
       89 天前   ❤️ 1
    才疏学浅,至今没用过分布式事务,我来个八股文链接,一起学习下:
    https://github.com/doocs/advanced-java/blob/main/docs/distributed-system/distributed-transaction.md
    sagaxu
        5
    sagaxu  
       89 天前   ❤️ 1
    经典八股了,虽然外包可能单 db 事务都用不上
    yeqizhang
        6
    yeqizhang  
       89 天前 via Android
    四五年前我也问过这种问题,知道事务是什么就行了,没必要在意半桶水的面试官。分布式事务高级点就中间件那些实现了算法、论文的,你回答属于业务系统的那块也没错,还有多数据源、多节点的数据库涉及到的事务。
    z1829909
        7
    z1829909  
       88 天前   ❤️ 1
    庙小妖风大, 水浅王八多.
    c3de3f21
        8
    c3de3f21  
       88 天前
    庙小妖风大, 水浅王八多.
    dododada
        9
    dododada  
       88 天前
    外包要这些干嘛?真的用到分布式事务的,都是些难搞的大型服务,要保证最终数据一致性那种,还要允许一点延迟,外包不是随便挖坑么
    me1onsoda
        10
    me1onsoda  
       88 天前
    事务当然是对数据库而言,跟应用没有直接关系
    laminux29
        11
    laminux29  
       88 天前
    不懂分布式事务,写程序容易造成数据状态不一致。如果公司有的选,当然要选懂分布式事务的程序员。

    举一个简单的场景,银行服务器的数据,分散在不同的物理机里。比如用户的借记卡数据在 IBM Server 上面,用户的信用卡数据在 X79 Server 上面,现在某用户通过借记卡,给自己的信用卡还款,思考一下,为什么各大银行的还款提醒,不是实时的,甚至有时候你晚上还款了,第二天银行还会给你发短信。通知你还款。

    再举个更常见的场景:
    Server1 保存用户订单信息,Server2 保存商品宝贝详情页。你想想为什么淘宝订单、京东订单、拼多多订单,很多年前的订单,已经看不到当时的商品详情。
    ilvsxk
        12
    ilvsxk  
       88 天前
    @laminux29 #11
    银行账单延迟和看不到详情单纯就是为了降本省成本,和分布式事务有啥关系?
    laminux29
        13
    laminux29  
       88 天前
    @ilvsxk

    银行账单延迟是银行没技术能力对 IBM Server 的老系统与 x86 的新系统做分布式事务的对接。
    JackSlowFcck
        14
    JackSlowFcck  
       88 天前
    分布式事务是指在分布式系统中,涉及多个数据库或服务节点的事务操作。在传统的单体应用中,事务通常由单个数据库管理,比较容易实现事务的一致性。但在分布式环境下,由于数据和操作分布在不同的节点上,事务的管理变得更加复杂。

    分布式事务通常具有以下特点:
    1. 多个数据源:涉及多个独立的数据库或数据存储节点。
    2. 跨服务调用:可能跨越多个不同的服务,每个服务可能有自己的事务管理机制。
    3. 数据一致性挑战:确保在多个节点上的数据操作要么全部成功,要么全部回滚,以保持数据的一致性。

    常见的分布式事务场景包括:
    1. 微服务架构:不同的微服务之间进行数据交互和业务操作时,可能需要保证事务的一致性。例如,在一个电商系统中,订单服务和库存服务分别在不同的微服务中,当创建订单时,需要同时减少库存,这就需要分布式事务来保证两个操作的一致性。
    2. 系统集成:多个独立的系统进行对接和数据同步时,也可能需要处理分布式事务。比如,企业内部的不同业务系统之间进行数据交换,要确保数据的完整性和一致性。

    实现分布式事务的方法有多种,常见的有两阶段提交( 2PC )、三阶段提交( 3PC )、补偿事务( TCC )、基于消息队列的最终一致性等。这些方法各有优缺点,需要根据具体的业务场景和需求进行选择。

    在面试中,如果被问到分布式事务场景,可以更加具体地阐述一些实际的业务例子,比如电商订单与库存的管理、银行转账系统中不同账户之间的资金转移等,并且可以简要介绍一下实现分布式事务的方法和思路。这样可以让面试官更好地了解你的知识深度和解决实际问题的能力。
    -----
    不蟹 bro
    MoYi123
        15
    MoYi123  
       88 天前
    真的有场景是不得不用分布式事务的吗?
    我遇到过的情况都是对数据库的事务理解不行, 然后搞了一套恶心人的分布式事务上去.
    wWjd5V5L0636B5YV
        16
    wWjd5V5L0636B5YV  
       88 天前
    @laminux29 #13 数据状态一致性不是技术选型决定的么?
    pangdundun996
        17
    pangdundun996  
       88 天前
    @laminux29 这个例子不太合适,银行这个是因为信用卡核心系统基本都是双信息系统,要等夜间跑批清算才能入账,跟分布式事务没关系
    pangdundun996
        18
    pangdundun996  
       88 天前
    @csys 一般还是本地消息表和可靠消息用得多,3PC 、TCC 那些我是没见到落地过
    dyllen
        19
    dyllen  
       88 天前
    数据同步也没什么大问题呀。就是多个系统之间的原子操作,要么成功要么失败,用处就是保证跨系统的业务操作数据的强一致性,和本地数据库的事务一个目的。
    silencil
        20
    silencil  
       88 天前   ❤️ 1
    八股文学习了一大堆,面试不到我学习的内容五分之一,工作内容涉及不到十分之一。
    isno
        21
    isno  
       88 天前
    https://www.thebyte.com.cn/distributed-transaction/transaction.html

    我这里介绍了 4 中分布式事务:BASE 、TCC 、SAGA 你可以看看。
    wei2629
        22
    wei2629  
       88 天前
    我的理解简单来说就是原子性,只有成功和失败两种情况。
    xueyuehua
        23
    xueyuehua  
       88 天前
    简单说就是一个 api 会经过多个微服务,其中一个挂了,导致数据对不上,比如给用户显示转账成功了,但是实际却扣钱了,但是钱没到另一个账号
    mikasyou
        24
    mikasyou  
       88 天前   ❤️ 2
    事务和线程很相似,但又不是很相似。得先认识到并发线程原子性和事务原子性的区别。

    一个是不可打断,不可继续分割;一个是存在回退机制,不会出现”错误数据“。

    其它的就可以利用你”如何安全的并发编程“相关理论,来认识分布式事务。就像一个变量参与多个线程,一个数据同步到多个数据库。

    你是如何控制这个变量在多个线程同步的?
    - 锁:最简单的阻塞,同步
    - 协程:有局限性但很合适的调度
    - 事件/回调:可用但也仅仅可用

    你又是如何控制这个服务在多个数据库保存操作中不会部分成功,部分失败的?
    - 多个事务当然也可以阻塞:一致性拉满,可用性降低,与线程锁的特性高度一致。
    - 多个事务当然也可以协作:可用性提高,一致性降低。倾斜程度根据协作方式而定,
    - 多个事务当然也可以回调:或许就是最终一致性了,到回调完成那一刻,数据才会变得正确。

    我认为分布式事务本身没什么复杂的,更多是因为涉及分布式事务的业务太复杂了。导致分布式事务看起来很难。其实回到本质还是同步问题。
    bthulu
        25
    bthulu  
       87 天前   ❤️ 1
    从来不用分布式事务, 都是调接口, 成功了就算了, 不成功, 就调回退接口, 回退接口也失败了, 打日志告警人工处理.
    现实中哪有真正的分布式事务? 你一次捞到多个数据库连接, 依次开启事务, 执行 sql, 然后 commit 的时候, 有几个成功了, 有几个失败了, 你怎么办? 提供成功的事务, 哪个数据库支持回滚? 就算支持回滚, 也会出现有几个回滚成功了, 有几个回滚失败了, 这时候你又咋办?
    Plutooo
        26
    Plutooo  
       87 天前
    先从事务讲起,单体服务的事务 ACID 由 spring 管理、数据库保证
    然后讲微服务下,A 服务调用 B 服务,为什么原来能在单体用的事务不生效了
    接着讲怎么解决,讲最终一致性(本地消息表、事务消息)、强一致性( 2PC 、TCC )
    讲市面上对应的中间件 rocketmq ? seata ?
    最后说你们项目怎么做的
    ilvsxk
        27
    ilvsxk  
       87 天前
    @laminux29 #13 银行 app 和云闪付 app 里的信用卡账单都能做到实时,而短信的账单就会延迟就是为了省成本,发短信是要钱的,银行有几块钱包月实时短信通知的业务。所以这和分布式事务有啥关系?
    ilvsxk
        28
    ilvsxk  
       87 天前
    @bthulu 对的,这才是真实的世界。
    laminux29
        29
    laminux29  
       87 天前
    @ilvsxk

    我并没有提银行 APP 与云闪付 APP ,请仔细的,认真的,阅读我在上面写的评论。做技术,一定要仔细认真。
    laminux29
        30
    laminux29  
       87 天前
    @bthulu

    Q1:现实中是否存在真正的分布式事务?
    A:存在。

    Q2:几个成功了, 有几个失败了, 你怎么办?
    A:只要有一个失败,此次分布式事务就按失败算。分布式框架或相关驱动模组,会自动回滚所有涉及到的分布式数据库,如果你是开发,此时你会 catch 到一个分布式事务失败的 Exception ,你需要做的是,按此次业务失败进行处理。

    Q3:提供成功的事务, 哪个数据库支持回滚?
    A:主流的关系型数据库,必然支持回滚,这是标准。

    Q4:就算支持回滚, 也会出现有几个回滚成功了, 有几个回滚失败了, 这时候你又咋办?
    A:关系型数据库在正常情况下,回滚一定会成功。如果出现回滚失败,这等同于数据库软件出错,此时数据库软件会写日志告警,甚至失去响应、崩溃。如果你是运维,在数据库部署阶段,就要对这些情况进行监控。如果你只是开发,你什么都不用管,问一下运维同事就行。

    以上知识在 [数据库原理与设计] 相关教程中有讲解,课程方面属于计算机系的本科课程。
    laminux29
        31
    laminux29  
       87 天前
    @pangdundun996

    1.本来我想用转账的例子来说明,但觉得太简单了,不符合本论坛水准。

    2.我举得这个例子很合适,你说的双信息系统是对的,但你说的夜间跑批清算是错的,清算早就是全天候的了,真正原因我在评论区里已经讲了。
    ilvsxk
        32
    ilvsxk  
       87 天前
    @laminux29
    对对对,你是中肯的,仔细的,认真的,做技术的,会阅读的,会评论的。
    justdoit123
        33
    justdoit123  
       87 天前
    @bthulu {哭笑脸} “打日志警告人工处理”,项目初期很受用。
    bthulu
        34
    bthulu  
       86 天前
    @laminux29 commit 后还能 rollback 的数据库, 是谁? oracle, mysql, sql server 还是 postgresql?
    laminux29
        35
    laminux29  
       86 天前
    @bthulu

    1.我在前面说的,是规则,像 RFC 一样,是大家都需要遵循的规范,而不是某款关系型数据库的专有功能。

    2.从你这个提问来看,你应该不是科班的。如果你对这个话题感兴趣,可以补习一下相关知识:
    https://docs.oracle.com/cd/B28359_01/server.111/b28310/ds_txns.htm
    bthulu
        36
    bthulu  
       86 天前
    @laminux29 可能你自己需要补习一下. 二阶段提交过程中, 部分成功, 部分失败, 这个时候你如何回滚? 我说的一直都是提交成功后的回滚, 不是说 commit 前的回滚.
    bthulu
        37
    bthulu  
       86 天前
    @bthulu 所有的分布式事务, 都在规避提交 commits 的过程中, 部分成功, 部分失败后的处理方案. 为什么? 因为这种情况下根本就无法自动处理. 部分失败的数据, 难道你还能锁定数据中止服务死等到底提交还是不提交?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   973 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 22:46 · PVG 06:46 · LAX 14:46 · JFK 17:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.