比如某个分支事务,用户执行了 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 操作回滚时,因为相同主键的记录的插入而违反主键唯一性约束,不能回滚成功。对吧?
实际上,这里是有全局写锁的机制来保障的,delete 操作所在的全局事务二阶段回滚完成前,这条记录的锁是不会释放的,所以相同的主键的记录是不会在这个时机插入进来的。
你可以看一下分支注册 lockKey 相关的逻辑。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。