开发者社区 问答 正文

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 1767 分享 版权
来自: 阿里开源
1 条回答
写回答
取消 提交回答
  • 实际上,这里是有全局写锁的机制来保障的,delete 操作所在的全局事务二阶段回滚完成前,这条记录的锁是不会释放的,所以相同的主键的记录是不会在这个时机插入进来的。

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

    2021-02-01 23:26:51
    赞同 展开评论