最近看了一些分布式事务相关的资料,决定记录下来。
参考文章: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