避免使用数据库XA事务

去年在开发国信统一用户系统使用到分布式数据库事务组件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 开源版本不提供此功能,需要自行开发。

你可能感兴趣的:(避免使用数据库XA事务)