Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

INSERT ON UPDATE EXECUTOR #4

Open
Charlie17Li opened this issue Feb 13, 2023 · 0 comments
Open

INSERT ON UPDATE EXECUTOR #4

Charlie17Li opened this issue Feb 13, 2023 · 0 comments

Comments

@Charlie17Li
Copy link
Owner

Charlie17Li commented Feb 13, 2023

INSERT ON UPDATE EXECUTOR

因为需要做 UNDO INSERT ON UPDATE EXECUTOR, 因此需要看下这部分代码

实现

核心: 当业务 SQL 中包含 INSERT ... ON DUPLICATE KEY UPDATE 语句时,该 EXECUTOR 需要在执行业务 SQL 前后保存数据库快照(before image 和 after image)。

流程:

  1. 根据业务 SQL 生成 beforeSelectSQL, 然后根据前者生成 beforeImage, 用于保存执行业务 SQL 前的数据库状态
  2. 执行业务 SQL
  3. 根据 beforeSelectSQL 和 beforeImage 生成 afterSelectSQL, 然后根据前者生成 afterImage, 用于保存执行业务 SQL 后的数据库状态

细节:

  1. INSERT ... ON DUPLICATE KEY UPDATE 不允许 update 主键

Q & A

01 beforeImage 和 afterImage 的作用

beforeImage 保存了执行业务 SQL 前的状态,用于当全局事务回滚驱动分支事务也回滚时,回滚到没有执行业务 SQL 前的状态
afterImage 保存了执行业务 SQL 后的状态, 用于当需要回滚时,校验当前业务数据是否与 afterImage 记录的数据保持一致,如果一样就回滚,如果不一样,说明数据出现了脏写的情况,需要人工处理

02 beforeImage 是怎么生成的?

根据业务 SQL 反向查询出被影响的数据, 核心就是生成 beforeSelectSQL, 源码分析todo

03 afterImage 是怎么生成的?

todo

参考

seata官网文档

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant