seata(https://github.com/seata/seata)是一个分布式事务解决方案,内置了对AT、XA、TCC、saga的支持,主要由TC TM RM三类角色,TC(事务协调器)作为服务端,TM(事务管理器)和RM(资源管理器)工作在客户端。 seata最大程度的保证了对应用的透明。
AT模式:AT模式是通过一个两阶段提交的方式来管理事务,
第一阶段:通过对数据库连接的代理,对分布式事务下的SQL语句进行了解析。 在SQL执行前后,生成了将要操作数据行的数据镜像(undolog),并和SQL操作一起作为一个事物插入到数据库中。
第二阶段:在分布式操作完成后,由TM完成事物的提交或者回滚(本质上发送提交或者回滚命令给TC服务端), 再又TC服务端通知各个分支事务进行提交或者回滚。 如果是提交操作,因为在第一阶段已经完成了数据库的事物,所以只需要删除对应的undolog即可,如果是回滚操作,则需要根据undolog,生成对应的反向语句,更新数据库。
在第一阶段末尾,有个很重要的操作是申请全局锁,如果申请失败,第一阶段的事务是不会提交的,这个全局锁,其实就是由准备更新的表的行主键Id组成。 如果这个时候其他事务需要更新对应行,在申请全局锁的时候会被拒绝,如果是查询操作,且不能未提交读,可以带上for update, seata会为select for updata查询出的数据检查是否有全局锁。
我的注解版(目前仅分析了AT模式):