seata出现脏数据的情况

最近阅读seata代码时,发现的一种出现脏数据情况,做个记录 (默认为AT模式)

1.出现问题的流程

在这里插入图片描述

已知在默认情况下,分支事务提交之前会向TC申请全局锁,随后等待TM -> TC 发起全局事务提交或者回滚,TC在处理全局事务提交的时候,需要做如下几件事情

1. 删除全局事务所有对应的分支事务占用的全局锁
2. 将全局事务状态状态改变由 Begin -> AsyncCommitting
3. 异步定时任务通知分支事务删除undoLog

由于步骤1,2,3并不是原子的,所以存在上述时序图中①与②出现一种情况就是,TC删除了全局锁,但是此时TC发生重启or宕机的情况
那么此时,出现了新的全局事务,就可以去修改当前全局事务本应该rollback的数据

2.用一个例子来说明这种情况

  • 以下假设分支事务执行了以下Update操作将此份undoLog保存到数据库中
  • SQL 为 update product set name = ‘GTS’ where name = ‘TXC’;
{
    "branchId": 641789253,
    "undoItems": [{
        "afterImage": {
            "rows": [{
                "fields": [{
                    "name": "id",
                    "type": 4,
                    "value": 1
                }, {
                    "name": "name",
                    "type": 12,
                    "value": "GTS"
                }, {
                    "name": "since",
                    "type": 12,
                    "value": "2014"
                }]
            }],
            "tableName": "product"
        },
        "beforeImage": {
            "rows": [{
                "fields": [{
                    "name": "id",
                    "type": 4,
                    "value": 1
                }, {
                    "name": "name",
                    "type": 12,
                    "value": "TXC"
                }, {
                    "name": "since",
                    "type": 12,
                    "value": "2014"
                }]
            }],
            "tableName": "product"
        },
        "sqlType": "UPDATE"
    }],
    "xid": "xid:xxx"
}
  • 回滚发生错误时的流程

在这里插入图片描述

如果这种情况发生,那么后续这个新的全局事务提交的话,就发生了脏数据的情况

您好!要配置Seata来支持动态数据源,您需要进行以下几个步骤: 1. 引入Seata相关依赖:在您的项目中添加Seata的依赖,这将包括seata-all、seata-spring-boot-starter和seata-configuration。 2. 配置Seata数据源代理:在Seata的配置文件中(一般是file.conf),找到store模块的配置部分,将store.mode设置为"db",并配置store.db驱动类型、链接地址、用户名和密码等。 3. 创建Seata数据库表:使用Seata提供的db_store脚本,创建相应的数据库表。这些表用于存储全局事务信息、分支事务信息以及锁信息。 4. 配置动态数据源:根据您使用的动态数据源框架,如Druid、HikariCP等,在应用的配置文件中配置数据源。确保您的数据源配置与Seata配置文件中的数据库信息一致。 5. 配置Seata代理数据源:在应用的配置文件中,使用Seata提供的DataSourceProxyBeanPostProcessor作为Bean后置处理器,将动态数据源包装成Seata可识别的代理数据源。这样Seata就可以拦截并管理您的事务了。 6. 配置分布式事务:在需要进行分布式事务管理的方法上,添加@GlobalTransactional注解。这将启用Seata对该方法的事务管理。确保该方法所在的服务已经接入Seata。 这些步骤是一般的配置流程,具体配置细节可能因您使用的技术栈和版本而有所不同。建议参考Seata官方文档和示例,以确保正确配置Seata的动态数据源支持。希望能对您有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值