XA方案
2PC的传统方案是在数据库层面实现的,如Oracle、MySQL都支持2PC协议,为了统一标准减少行业内不必要的对接成本,需要制定标准化的处理模型及接口标准,国际开放标准组织Open Group定义了分布式事务处理模型DTP(Distributed Transaction Processing Reference Model),基于数据库的XA协议来实现2PC又称为XA方案。
XA方案分为准备阶段、提交阶段
1、在准备阶段资源管理器执行实际的业务操作,但不提交事务,资源锁定。
2、在提交阶段事务管理器会接受资源管理器在准备阶段的执行回复,只要有任一个资源管理器执行失败,事务管理器会通知所有资源管理器执行回滚操作,否则,事务管理器将会通知所有资源管理器提交该事务。提交阶段结束资源锁释放。
XA方案的问题
1、需要数据库支持XA协议。
2、资源锁需要等到两个阶段结束才释放,性能较差。
Seata的AT事务模式
Seata 是一款开源的分布式事务解决方案,将为用户提供 AT、TCC、SAGA 和 XA 事务模式。
AT事务模式也是一种2PC方案。
AT事务模式
一阶段:
业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
二阶段:
提交异步化,非常快速地完成。
回滚通过一阶段的回滚日志进行反向补偿。
seata事务控制流程图
tx1 先开始,开启本地事务,拿到本地锁,更新操作 m = 1000 - 100 = 900。tx1提交本地事务前,先拿到该记录的 全局锁 ,本地提交释放本地锁。
tx2 后开始,开启本地事务,拿到本地锁,更新操作 m = 900 - 100 = 800。本地事务提交前,tx2需要拿该记录的 全局锁 。tx1 全局提交前,该记录的全局锁被 tx1 持有,tx2 需要重试等待 全局锁,tx2拿到该记录的全局锁后,才能提交本地事务 。
Seata实现2PC与传统2PC的差别:
传统2PC需要数据库支持XA协议;Seata的AT模式是在应用程序导入Seata依赖即可,以中间件方式实现2PC,不依赖数据库实现。
两阶段提交方面,传统2PC无论第二阶段的决议是commit还是rollback,事务性资源的锁都要保持到阶段二完成才释放。而Seata的做法是在阶段一就将本地事务提交,这样就可以省去阶段二持锁的时间,稍微提高了效率。
简单用了下Seata,感觉性能有点低,每秒事务数一上来,很容易发生拿不到全局锁,抛出异常。