当前位置:网站首页>Seata分布式事务失效,不生效(事务不回滚)的常见场景
Seata分布式事务失效,不生效(事务不回滚)的常见场景
2022-07-03 09:25:00 【暮晓引流软件】
一、微服务没有正常获取XID
检查方法:
在每个微服务中调用方法 RootContext.getXID() 检查XID
例如,服务A调用了服务B和服务C
那么可以分别在服务A、服务B、服务C的事务方法中添加
===============服务A
@Service
public class ServiceAImpl implements IServiceA
{
private static final Logger log = LoggerFactory.getLogger(ServiceAImpl.class);
@Autowired
private IServiceB serviceB;
@Autowired
private IServiceC serviceC;
@Override
@GlobalTransactional
@Transactional
public Boolean doA() {
log.info("Seata全局事务id=================>{}",RootContext.getXID());
//......
}
}
===============服务B
@Service
public class ServiceBImpl implements IServiceB
{
private static final Logger log = LoggerFactory.getLogger(ServiceBImpl.class);
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Boolean doB() {
log.info("Seata全局事务id=================>{}",RootContext.getXID());
//......
}
}
===============服务C
@Service
public class ServiceCImpl implements IServiceC
{
private static final Logger log = LoggerFactory.getLogger(ServiceCImpl.class);
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Boolean doC() {
log.info("Seata全局事务id=================>{}",RootContext.getXID());
//......
}
}
(1)查看XID是否为null
(2)每个服务中的XID不一致
如果出现以上两种其中一种,基本可以确定是因为XID导致事务失效
解决办法:
(1)XID正常情况下是通过请求头上的参数传递给下游服务的,可以通过seta包的getModifyRequest方法下的headers.put打断点进行分析
(2)在调用方法中直接传参给下游服务
===============服务A
@Service
public class ServiceAImpl implements IServiceA
{
private static final Logger log = LoggerFactory.getLogger(ServiceAImpl.class);
@Autowired
private IServiceB serviceB;
@Autowired
private IServiceC serviceC;
@Override
@GlobalTransactional
@Transactional
public Boolean doA() {
String XID = RootContext.getXID();
serviceB.doB(XID);
serviceC.doC(XID);
//......
}
}
===============服务B
@Service
public class ServiceBImpl implements IServiceB
{
private static final Logger log = LoggerFactory.getLogger(ServiceBImpl.class);
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Boolean doB(XID) {
RootContext.bind(XID);
//......
}
}
===============服务C
@Service
public class ServiceCImpl implements IServiceC
{
private static final Logger log = LoggerFactory.getLogger(ServiceCImpl.class);
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Boolean doC(XID) {
RootContext.bind(XID);
//......
}
}
二、undo_log表有脏数据
当Seata没有正常结束时,每个服务对应数据库中的undo_log表和seata持久化数据库的brach_table、global_table、lock_table、undo_log表都有可能有脏数据没有正确删除,从而导致服务一直回滚,却不成功
**解决办法:**清除undo_log表以及seata持久化数据库的brach_table、global_table、lock_table、undo_log表中的脏数据
三、Fegin调用使用了Fallback降级或抛出的异常被全局处理
这种情况下属于seata服务发现不了下游服务抛出的异常,导致事务不会触发回滚
解决办法:
(1)通过 GlobalTransactionContext.reload(RootContext.getXID()).rollback() 进行手动回滚
===============服务A
@Service
public class ServiceAImpl implements IServiceA
{
private static final Logger log = LoggerFactory.getLogger(ServiceAImpl.class);
@Autowired
private IServiceB serviceB;
@Autowired
private IServiceC serviceC;
@Override
@GlobalTransactional
@Transactional
public Boolean doA() {
Integer bStatus = serviceB.doB();
if(bStatus == 0){//在Mybatis中,返回值为0证明插入失败
//手动回滚
GlobalTransactionContext.reload(RootContext.getXID()).rollback();
return false;
}
Integer cStatus = serviceC.doC();
if(cStatus == 0){//在Mybatis中,返回值为0证明插入失败
//手动回滚
GlobalTransactionContext.reload(RootContext.getXID()).rollback();
return false;
}
//......
}
}
===============服务B
@Service
public class ServiceBImpl implements IServiceB
{
private static final Logger log = LoggerFactory.getLogger(ServiceBImpl.class);
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Boolean doB() {
//......
Integer insertStatus = serviceBDAO.insert();
return insertStatus;
}
}
===============服务C
@Service
public class ServiceCImpl implements IServiceC
{
private static final Logger log = LoggerFactory.getLogger(ServiceCImpl.class);
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Boolean doC() {
//......
Integer insertStatus = serviceCDAO.insert();
return insertStatus;
}
}
(2)通过切面类
详见官方文档
边栏推荐
- LeetCode - 933 最近的请求次数
- Label Semantic Aware Pre-training for Few-shot Text Classification
- Anaconda安装包 报错packagesNotFoundError: The following packages are not available from current channels:
- CV learning notes - feature extraction
- Neural Network Fundamentals (1)
- Stroke prediction: Bayesian
- Pytorch ADDA code learning notes
- ECMAScript--》 ES6语法规范 ## Day1
- Hands on deep learning pytorch version exercise solution - 2.5 automatic differentiation
- Octave instructions
猜你喜欢

LeetCode - 508. Sum of subtree elements with the most occurrences (traversal of binary tree)

Leetcode-112:路径总和

Raspberry pie 4B deploys lnmp+tor and builds a website on dark web

Policy gradient Method of Deep Reinforcement learning (Part One)

CV learning notes - clustering

Basic use and actual combat sharing of crash tool
![[LZY learning notes dive into deep learning] 3.1-3.3 principle and implementation of linear regression](/img/ce/8c2ede768c45ae6a3ceeab05e68e54.jpg)
[LZY learning notes dive into deep learning] 3.1-3.3 principle and implementation of linear regression

Leetcode-106: construct a binary tree according to the sequence of middle and later traversal

Hands on deep learning pytorch version exercise solution-3.3 simple implementation of linear regression

LeetCode - 919. Full binary tree inserter (array)
随机推荐
LeetCode - 1670 設計前中後隊列(設計 - 兩個雙端隊列)
LeetCode - 705 设计哈希集合(设计)
Hands on deep learning pytorch version exercise solution -- implementation of 3-2 linear regression from scratch
LeetCode - 508. Sum of subtree elements with the most occurrences (traversal of binary tree)
20220608其他:逆波兰表达式求值
Opencv image rotation
Opencv feature extraction sift
20220602 Mathematics: Excel table column serial number
Hands on deep learning pytorch version exercise solution - 2.5 automatic differentiation
20220531数学:快乐数
LeetCode - 706 设计哈希映射(设计) *
20220607 others: sum of two integers
Leetcode - 895 maximum frequency stack (Design - hash table + priority queue hash table + stack)*
重写波士顿房价预测任务(使用飞桨paddlepaddle)
3.2 Off-Policy Monte Carlo Methods & case study: Blackjack of off-Policy Evaluation
Deep Reinforcement learning with PyTorch
『快速入门electron』之实现窗口拖拽
LeetCode - 900. RLE iterator
2.1 Dynamic programming and case study: Jack‘s car rental
Raspberry pie 4B installs yolov5 to achieve real-time target detection