去年在开发国信统一用户系统使用到分布式数据库事务组件atomikos,系统有一天突然假死,查了好久才找到是XA事务导致的问题,现在总结下:
1、什么是XA事务
XA事务是基于二阶段提交(Two-phase Commit)实现的。
下面两个图片来自:http://www.infoq.com/cn/articles/xa-transactions-handle
提交
出错回滚
2、XA事务问题
XA事务的明显问题是timeout问题,比如当一个RM(资源管理器)出问题了(例如数据库正好在做备份,这样数据库就会很慢),那么整个事务只能处于等待状态。这样可以会连锁反应,导致整个系统都很慢,最终不可用(连接耗尽)。
3、如何避免XA事务
通常做法是使用最终一致性去解决。
举个网上的例子:
用户充值500元
1、带上用户帐号在数据库里的版本,在更新时比较数据的版本,如果相同则加上500;
2、比如用户本来有500元,那么消息是更新用户的钱数为1000,而不是加上500;
当然最好的办法就是使用RocketMQ 事务消息来解决分布式事务,但悲剧的是RocketMQ 开源版本不提供此功能,需要自行开发。
网友评论