记一次MyCat因Spring事务未回滚而应用故障的生产问题

最近生产环境出现一个问题,某张表里的primary key主键出现了重复冲突(duplicate key),应用层抛出了异常,但应用的其他不相关功能也受到了影响,比如查询数据失败。按道理,这属于不同事务之间的功能,应该不会受关联影响。

 

查看代码,spring.xml已经配置了事务管理器,对所有insert开头的插入方法增加了事务处理:

<tx:method name="insert*" propagation="REQUIRED">

这里的事务传播特性是REQUIRED:如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。

 

虽然配置了事务,但在manager层,却对异常进行了捕获,这样在抛异常时,事务是不会回滚的。而MyCat有个坑的地方,当事务没有回滚时,失败的连接还在,导致其他事务的功能也会失败。

try {
    mapper.insertData(model);
} catch (Exception e) {
    LOGGER.error("insert data failed", e);
}

对于Spring已经声明了@Transactional,不能在方法里自己捕获unchecked exception,可以让Spring的AOP切入点自己去监听,从而将事务回滚掉。

所以方法里直接去掉try catch即可:

mapper.insertData(model);

 

目前MyCat的分布式事务为弱XA事务,这样是无法保证强一致性。当跨多个节点提交时,事务只能回滚那些提交失败节点上的操作,对于已经提交成功的节点,是无法进行回滚的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值