[seata]@GlobalTransactional和@Transactional注解同时使用时,在回滚时加入@Transactional注解得方法没有得到回滚,且lock_table表里得事务记录没有被删除

2024-07-15 250 views
3

使用seata时,同时使用@GlobalTransactional和@Transactional注解,@GlobalTransactional注解在接口最外层方法,@Transactional注解在内层方法上,事务失败时,加入@Transactional注解得操作没有被回滚,且lock_table表中有数据没有被删除,导致再次执行同样得操作时出现异常.如下: Could not commit JDBC transaction; nested exception is io.seata.rm.datasource.exec.LockConflictException: get global lock fail, xid:10.244.15.4:8091:5557653063327397852, lockKeys:d_member_info:5086811;d_integral_inventory:42560184;d_integral_detail_record:7766197;d_integral_header:6552630

回答

2

没有回滚先去看下这个xid的全局事务状态是什么 get global lock fail,你自己确认下lock表的那个记录中xid是什么,去看下xid对应的全局事务状态是什么,这个失败时本地事务根本就不会提交,何来的不回滚之说

0

但是,我数据库中得数据确实是数据不一致了。加了@transactional注解得表有数据,没加得就没有数据。

7

本地事务提交了,说明事务发起方(TM)函数没有抛出异常,可以检查下参与方分支事务(TC)的异常是不是被吃了,如果TM收不到异常是不会回滚的。

而且这种情况,就算不加@Trasaction,也会有相同问题。

3

我也遇到了这个问题,加了@GlobalTransactional的方法A调用加了@Transactional的方法B,方法B报错了,全局事务一直回滚不了,报Has dirty records when undo,一直在重试

2

可以看看@transactional修饰方法的事务id和注册到seata中的事务id相同吗