嘘~ 正在从服务器偷取页面 . . .

分布式事务


项目报错

报错:

Response[ TransactionException[Could not found global transaction xid =xxx.xxx.xx.xxx status = Rollbacked

原因:

  • SeataAT模型调用其他服务时是异步的。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操作之前执行了。

文章作者: 张纯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 张纯 !
  目录