背景
在单体系统中,一般采用数据库事务来保证数据的一致性,需要满足ACID。但分布式系统的事务跨域了不同的服务、不同的数据库,已经不能单靠数据库的事务来实现了,因而需要专门的分布式事务解决方案。
XA模式
XA模式是一种刚性事务,能保证强一致性,底层采用数据库的事务,在事务期间需要长时间锁定资源。
XA模式有2PC和3PC两种实现方式。
2PC分为准备阶段和提交阶段。
事务管理器开启事务,记录事务。
准备阶段,各个服务开启本地事务,执行完毕提交本地事务之前向事务管理器返回完成标识。
提交阶段,上一阶段各个服务都返回完成标识之后,事务管理器更新分布式事务状态为提交,就进入提交阶段,系统会向所有的服务发送提交命令,各个服务提交事务。
即使事务管理器挂掉了,重启之后也能根据事务日志继续完成事务操作。
如果事务管理器没收到服务器的ACK,会重复发生命令,服务器需要实现幂等。
如果服务器长时间未收到事务管理器的命令,会自动回滚本地事务。
TCC
TCC模式对应(try- confirm-cancel),需要在业务层面实现事务的补偿。该模式不需要长时间锁定资源。
该模式不依赖数据库机制,而是将事务放在了业务层,通过业务补偿来保证一致性。
在第一阶段询问所有资源管理器“准备”是否成功,如果所有资源均“准备”成功则在第二阶段执行所有资源的“提交”操作,否则在第二阶段执行所有资源的“回滚”操作,保证所有资源的最终状态是一致的。
该模式需要编码实现TCC 的 Try、Confirm、Cancel 3 个方法。
seata AT
AT模式是seata框架特有的一种模式,该模式会自动生成事务的回滚SQL,也就是undo log。
也采用本地事务执行,提交本地事务之前需要获取行记录的全局锁,当分布式事务提交才会是否全局锁。
一旦发生回滚,则会直接调用undo log进行回滚。
该方式业务侵入低。
可靠消息最终一致性
可靠消息最终一致性有本地消息表和消息队列两种方式。
该方案的思想也是拆分大事务为小事务。通过消息状态和业务节点进行绑定来进行业务重试确保一致性。
通过本地事务保存消息状态,通过定时任务重试来保证事务按照既定流程执行。该方式需要保证幂等。
消息状态分为中间态和终态,需要对中间态进行重试。每执行一部分业务,就通过本地事务变更消息状态和保存数据。
如果进入非正常业务流程导致的终态,则需要人工介入进行补偿。
该模式不需要引入分布式事务组件,并且不需要锁定资源,在互联网项目中应用较多。
saga模式
该模式的思想是大事务拆分成本地事务,一旦发生异常,则按照补偿方案进行回滚。
适合长事务。