1,自己遇到的场景:支付订单的时候,用账户余额支付,支付成功后,需要更新用户的账户余额,同时新增一条账户明细流水信息,方便以后对账,用到了memer用户服务
2,查找失效的原因
1)出现事务失效的情况下,优先检查子服务是否和主服务的XID保持一致,RootContext.getXID()
2) Fegin调用使用了Fallback降级或抛出的异常被全局处理(比如全局异常处理GlobalExceptionHandler),seata会认为你已经手动处理了异常,我就是这个原因导致的,通过 GlobalTransactionContext.reload(RootContext.getXID()).rollback() 进行手动回滚
3)主服务加上@GlobalTransactional(rollbackFor = Exception.class)即可,最好加上rollbackFor = Exception.class,表示遇到Exception都回滚,不然遇到有些异常(如自定义异常)则不会回滚
4)undo_log表有脏数据,需要自己清除undo_log表以及seata持久化数据库的brach_table、global_table、lock_table、undo_log表中的脏数据