分布式 - 事务的解决方案
事务有四个特性(ACID),原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)
1.编程式事务:使用TransactionTemplate 或者直接使用底层的TransactionManager 来操作事务commit或者rollback。
2.声明式事务:建立在AOP 基础上,通过对方法前后进行拦截,加入编程式事务里的流程控制逻辑。使用的时候只需要在方法前面加上@Transactional 注解
3PC 事务
3PC,全称“three phase commit”,是2PC 的改进版,其将2PC 的“提交事务请求” 过程一分为二。
第一个阶段: CanCommit
1.事务询问:协调者向所有的参与者发送一个包含事务内容的canCommit 请求,询问是否可以执行事务提交操作,并开始等待各参与者的响应。
2.各参与者向协调者反馈事务询问的响应:参与者接收来自协调者的canCommit 请求,如果参与者认为自己可以顺利执行事务,就返回Yes,否则反馈No 响应。
第二阶段:precommit
协调者在得到所有参与者的响应之后,会根据结果执行2 种操作:执行事务预提交,或者中断事务。
第三阶段:docommit
- 执行提交
- 中断事务(假设有任何参与者反馈了no 响应,或者超时了,就中断事务)
与2pc 的区别
优点:
相比较2PC,最大的优点是减少了参与者的阻塞范围(第一个阶段是不阻塞的),并且能够在单点故障后继续达成一致(2PC 在提交阶段会出现此问题,而3PC 会根据协调者的状态进行回滚或者提交)。
缺点:
如果参与者收到了preCommit 消息后,出现了网络分区,那么参与者等待超时后,都会进行事务的提交,这必然会出现事务不一致的问题
TCC
TCC 其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其业务逻辑对应的确认和补偿(撤销)操作。
其将整个业务逻辑的每个分支显式的分成了Try、Confirm、Cancel 三个操作。Try 部分完成业务的准备工作,confirm 部分完成业务的提交,cancel部分完成事务的回滚。
MQ(事务消息)
目前,仅阿里云的RocketMQ 支持事务消息。帮助用户实现类似X/Open XA 的分布事务功能,通过MQ 事务消息能达到分布式事务的最终一致。
Lcn 事务
锁定事务单元(lock)
确认事务模块状态(confirm)
通知事务(notify)
TX-LCN 定位于一款事务协调性框架,框架其本身并不操作事务,而是基于对事务的协调从而达到事务一致性的效果。
Seata 事务
以高效并且对业务0 侵入的方式,解决微服务场景下面临的分布式事务问题。
seata 的AT 模式,采用的是大量运用在数据库软件的Write Ahead Log 思想,即把事务的信息以事务日志的方式记录下来。
这种处理方式,实际上是对传统两阶段提交的一种改进和优化。主要有几个关键点:
- 传统两阶段提交协议是阻塞协议,性能差
- 传统两阶段提交协议高可用性不好
- 传统两阶段提交协议的全局事务隔离机制不支持
- 根据八二原则,80% 的涉及到全局事务的业务是能正常完成并提交的。
在AT 模式下,seata 采取的做法是,一个事务分支的数据库操作执行完后,马上进行本地事务的提交,从而释放相关的数据库资源。