分布式事务及解决方案

最近看了一些分布式事务相关的资料,决定记录下来。

参考文章:https://www.cnblogs.com/jing99/p/11769093.html

                  https://blog.youkuaiyun.com/xianyucishi/article/details/105481109

要了解分布式事务,首先要知道事务的四大特性:ACID

一、什么事分布式事务

所谓分布式事务,即分布式场景下的事务问题,如场景:服务A中的方法A()调用服务B中的方法B()和服务C中的方法C(),由于三个方法属于三个不同的服务,相互调用需要通过远程连接的方式进行调用,此时三个服务中的三个方法访问数据库属于不同的访问连接;

    /**
     * A服务中的方法A
     * @throws Exception
     */
    @Transactional(rollbackFor =Exception.class)
    public void A()throws Exception{
        System.out.println("。。。业务代码。。。");
        //调用B服务中的B方法
        B();
        System.out.println("。。。业务代码。。。");
        //调用C服务中的C方法
        C();
        System.out.println("。。。数据库操作。。。");
    }
    /**
     * B服务中的方法B
     * @throws Exception
     */
    @Transactional(rollbackFor =Exception.class)
    public void B()throws Exception{
        System.out.println("。。。数据库操作。。。");
    }
    /**
     * C服务中的方法C
     * @throws Exception
     */
    @Transactional(rollbackFor =Exception.class)
    public void C()throws Exception{
        System.out.println("。。。数据库操作。。。");
    }

事务情况分析:

1、方法A首先调用B方法,若B方法调用失败并抛出异常,此时B方法数据库操作未执行成功事务回滚,然后A方法捕获到B方法抛出的异常,终端后面代码的执行,尚未执行其他数据库操作,此时无分布式事务问题。

2、方法A首先调用B方法,若B方法调用成功,此时B方法数据库操作成功事务执行完毕,然后A方法继续调用C服务中的C方法,若此时C方法执行失败并抛出异常,则C方法中的本地事务回滚,然后A方法捕获C方法抛出的异常,并终止后面代码的执行抛出异常,但此时B方法中的本地事务已经执行完毕,无法回滚(只有捕获到异常时回滚),此时则就出现了B方法和C方法事务不一致问题,即分布式事务问题。为了解决B和C事务不一致的问题,此时应该想办法去通知B回滚事务,即分布式事务的解决方案之一。

3、当然,此时如果A调用B和C都成功,但执行A本方法内的数据库操作时失败了,同样也是分布式事务问题,因为它无法通知B、C事务进行回滚。

其实,单体服务中也存在分布式事务问题,当上述A、B、C三个方法在同一个服务中,但是三个方法需要操作三个不同的数据库时,由于是不同的数据库访问连接,此时同样会出现上面同样的问题,也属于分布式事务问题。

二、分布式事务的解决方案:

分布式事务解决方法:

1、基于XA两段式提交方法(2PC):参考

XA:XA协议,规定事务管理器和资源管理器接口,采用二阶段提交协议。 XA 规范主要定义了事务管理器(Transaction Manager)和局部资源管理器(Local Resource Manager)之间的接口。

两段式提交的核心是事务管理器,由事务管理器进行对参与事务的资源进行管理

优点:能够解决分布式事务问题,原理简单,实现方便;

缺点:同步阻塞,因为事务管理器要收集各个资源管理器的响应消息,如果其中一个或多个一直不返回消息,则事务管理器一直等待,应用程序也被阻塞,甚至可能永久阻塞。

2、TCC三段式事务补偿提交方法

所谓TCC即,try.....confirm.....cancel其将整个业务逻辑的每个分支显式的分成了Try、Confirm、Cancel三个操作。TCC方案其实是两阶段提交的一种改进,TCC方案在电商、金融领域落地较多。

TCC的核心思想是"参与事务的应用程序都应该提供三个http接口,由一个事务协调者进行整体事务的协调"Try接口:预留业务资源;跟普通的操作操作差不多,只是有个status来标识为预生效;
Confirm接口:确认执行业务操作;update status改为生效;
Cancel接口:取消执行业务操作;如果有报错,那么多个分接口都需要需求,比如把status该为取消等。

具体实现可参考文章:https://blog.youkuaiyun.com/weixin_38399962/article/details/82144877

                                    https://blog.youkuaiyun.com/xianyucishi/article/details/105722959

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值