项目报错
报错:
Response[ TransactionException[Could not found global transaction xid =xxx.xxx.xx.xxx status = Rollbacked
原因:
Seata
的AT
模型调用其他服务时是异步的。seata
的全局事务超时时间设置太短了,导致注册分支事务的时候,全局事务都已经进入第二阶段了。while expecting Begin
描述:分支事务注册时,全局事务状态需是一阶段状态begin
,非begin
不允许注册。属于seata
框架层面正常的处理,用户可以从自身业务层面解决。- 简单来讲这次的错误是因为打断点项目进行太长导致的超时。
分布式事务
原理:
事务是逻辑上的一组sql
语句,在一个事务中的sql
语句要么一起成功,要么一起失败。
本地事务就是这一组sql语句在一个数据库连接中执行,即我们常说的事务就是一个本地事务,遵循ACID的。@Transactional
是本地事务的实现方式
分布式事务就是这一组sql
语句在不同的数据库连接执行。
使用场景:
- 1.分支事务是异步,全局事务无法感知它的执行进度,全局事务已进入二阶段,该异步分支才来注册
- 2.服务a rpc 服务b超时(dubbo、feign等默认1秒超时),a上抛异常给tm,tm通知tc回滚,但是b还是收到了请求(网络延迟或rpc框架重试),然后去tc注册时发现全局事务已在回滚
- 3.tc感知全局事务超时(@GlobalTransactional(timeoutMills = 默认60秒)),主动变更状态并通知各分支事务回滚,此时有新的分支事务来注册
- 4.添加事务注解的方法不是第一个执行sql语句的地方,即在方法A上添加了事务注解,但是在方法A中执行sql操作之前调用了方法B,方法B属于分支事务,方法B中的sql操作在方法A的sql操作之前执行了。