seata

在Seata的AT(Automatic Transaction)模式下,对于UPDATE SQL语句的回滚操作,Seata通过拦截SQL语句,记录在执行UPDATE操作之前的数据(称为before image),以及执行UPDATE之后的数据(称为after image)。这些数据被保存在Seata的undo日志表中,以便在事务回滚时使用。

Seata AT模式下的回滚日志记录过程

1. 拦截SQL语句

Seata的RM(Resource Manager)会拦截所有涉及数据库的SQL语句,包括UPDATE操作。

2. 获取before image

在执行UPDATE语句之前,Seata会执行查询操作,获取受影响数据的当前状态,即before imagebefore image包含了被修改的行的原始值。

3. 执行UPDATE语句

获取before image后,Seata会继续执行原本的UPDATE语句,更新数据库中的数据。

4. 获取after image

在执行UPDATE语句之后,Seata再次执行查询操作,获取受影响数据的更新后状态,即after imageafter image包含了被修改的行的新值。

5. 记录undo日志

Seata将before imageafter image存储到undo日志表中。这个表用来记录每一个受Seata管理的事务的回滚信息。

回滚操作

当事务需要回滚时,Seata会使用undo日志表中的信息来恢复数据。具体步骤如下:

  1. 获取undo日志:Seata根据事务ID(XID)查找对应的undo日志,获取该事务的before imageafter image
  2. 生成回滚SQL:Seata根据before image生成逆向的SQL语句,以便恢复数据到原始状态。例如,对于一个UPDATE操作,生成一个反向的UPDATE语句,用before image的值覆盖当前值。
  3. 执行回滚SQL:Seata执行生成的回滚SQL,将数据恢复到事务开始前的状态。

示例

假设我们有一个表 user,包含 idbalance 字段。我们执行一个UPDATE语句,将用户ID为1的用户余额增加100。

原始UPDATE语句
UPDATE user SET balance = balance + 100 WHERE id = 1;
获取before image

在执行UPDATE语句之前,Seata会执行以下查询,获取before image

SELECT id, balance FROM user WHERE id = 1;

假设查询结果为:

id: 1, balance: 200
执行UPDATE语句

Seata继续执行原始的UPDATE语句:

UPDATE user SET balance = balance + 100 
  • 26
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值