开发者社区> 问答> 正文

seata 事务回滚疑问

比如某个分支事务,用户执行了 delete 操作,那么 prepare 阶段,提交了,但是全局事务失败,导致回滚

目前的做法是通过 代理 connection,拿到用户执行的所有sql语句,保存 before,after image 在 undo_log 表中。

如果提交就通过 gxid, bxid 删除数据undo_log

如果失败了,就数据回退 before image .

但是 delete 成功了,但是全局事务失败,但是其他事务,在回滚前,insert了相同key的数据,导致无法回滚? 要么就是采用 xa 事务,这些变更的数据,commit/rollback 前没法修改。

AbstractUndoExecutor 有三个子类,分别对应 mysql的 insert , delete, update 的反向操作,多个事务,修改同一条数据,怎么确保数据的正确性

delete 操作回滚时,因为相同主键的记录的插入而违反主键唯一性约束,不能回滚成功。对吧?

展开
收起
一人吃饱,全家不饿 2021-02-01 23:26:40 1722 0
来自:阿里开源
1 条回答
写回答
取消 提交回答
  • 实际上,这里是有全局写锁的机制来保障的,delete 操作所在的全局事务二阶段回滚完成前,这条记录的锁是不会释放的,所以相同的主键的记录是不会在这个时机插入进来的。

    你可以看一下分支注册 lockKey 相关的逻辑。

    2021-02-01 23:26:51
    赞同 展开评论 打赏
来源圈子
更多
收录在圈子:
+ 订阅
阿里巴巴相信开源的世界里人人贡献代码,人人获得收益,共同创造一个互帮互利的社区,促进技术进步和发展。
问答排行榜
最热
最新

相关电子书

更多
《Seata 1.3 新特性以及如何参与社区》 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载