当前位置:网站首页>链式方法调用的事务问题剖析
链式方法调用的事务问题剖析
2022-07-26 10:28:00 【范学博】
最近做了分布式的项目,当然没有设计分布式事务的处理,一条逻辑线太长,方法调方法,所以之间的事务问题就暴露出来了
我已阵亡,直接码代码吧
@Service
public class TransactionalServiceImpl implements TransactionalService {
@Autowired
private CgpMngUserbraService cgpMngUserbraService;
@Transactional
@Override
public void method() {
CgpMngUserbra cgpMngUserbra = cgpMngUserbraService.selectUserBraRules(0, 0);
if (null == cgpMngUserbra) {
cgpMngUserbraService.insertUserBraRules(0, 0, "method");
}
method2();
}
// @Transactional//此处事务不会生效,原因可阅读上一篇博客
// 传送门---> https://blog.csdn.net/fanxb92/article/details/81296005
public void method2() {
CgpMngUserbra cgpMngUserbra = cgpMngUserbraService.selectUserBraRules(0, 0);
if (null == cgpMngUserbra) {
cgpMngUserbraService.insertUserBraRules(0, 0, "method2");
}
TransactionalServiceImpl transactionalService = (TransactionalServiceImpl) AopContext.currentProxy();
transactionalService.method3();
}
@Transactional
// @Transactional(propagation = Propagation.REQUIRES_NEW)
// @Transactional(propagation = Propagation.NESTED)
public void method3() {
CgpMngUserbra cgpMngUserbra = cgpMngUserbraService.selectUserBraRules(0, 0);
if (null == cgpMngUserbra) {
cgpMngUserbraService.insertUserBraRules(0, 0, "method3");
}
}
}先介绍一下测试逻辑:
1、method,method2,method3三个方法都会在一张表保存同一条数据,并且链式调用。
2、method2加事务是不生效的,method2中事务和method中保持一致,参照代码中博客链接。
3、下面是测试级联事务,method3上面三种事务处理方式
- 第一种@Transactional,method3中事务和前面保持一致(method方法上注解产生的事务中),全部执行完毕,数据库中一条数据(createdBy = 'method')。一定是全部执行完毕哦,中途打断点,method中还为插入到数据库,因为方法未结束,未commit。
- 第二种@Transactional(propagation = Propagation.REQUIRES_NEW),method3开启了一个新的事务,会将已有的事务挂起,
同样,方法全部执行完毕后数据库两条数据,数据库记录截图如下:
可见,是method中数据入库时间在前,分析===>
!!!!!!!!!此处非常重要,可能说的不太简洁精确,仔细体会!!!!!!!!!!!!!!!!!!
method中执行insert(此时会插入第一条数据createdBy = 'method'),在方法未执行结束时未commit,数据库中无插入记录,但是在缓存中存在。
method2方法嵌套在method方法中,在同一事务中,method2方法中会查询到记录,所以不会再插入数据。
method3方法嵌套在method2方法中,开启了新的事务,不会查询到method方法事务中的数据,所以会执行insert(插入第二条数据createdBy = 'method3')。
此处是细节哦!!!>>>>>>method3方法开启新事务,方法执行完毕就会提交,
可在method3结束但method未结束的地方打断点,会看到数据库已经有记录了(createdBy = 'method3')。
放开断点,全部执行完毕,数据库有两条记录,如前面的截图。
可见级联开启新事务是可以的,但一定要调用外部外方法才会生效,或者使用AopContext.currentProxy()。
- 第三种@Transactional(propagation = Propagation.NESTED)
抛出异常JpaDialect does not support savepoints - check your JPA provider's capabilities
public JpaTransactionManager() {setNestedTransactionAllowed(true);}
后来才知道Hibernate也不支持Nested Transaction,测试不了,只能用jdbc事务了,使用JdbcTemplate。
好吧,就先聊这么多吧。谢谢阅读。
边栏推荐
- Dynamically determine file types through links
- [Halcon vision] Fourier transform of image
- Redis realizes the correct posture of token bucket
- The software cannot be opened
- 简单化构造函数的继承方法(二)- ES6中的class继承
- PLC概述
- [Qualcomm][Network] qti服务分析
- Study on the basis of opencv
- [gossip] error loading psychopg2 module: no module named psychopg2
- Draco developed by Google and Pixar supports USD format to accelerate 3D object transmission & lt; Forward & gt;
猜你喜欢

数据库的复习--3.SQL语言

码云,正式支持 Pages 功能,可以部署静态页面
![[Halcon vision] image gray change](/img/62/426713becba851f034e6008f28bdb0.png)
[Halcon vision] image gray change
![[Halcon vision] image filtering](/img/7a/b95f8977f02fab644ef9fb205424e7.png)
[Halcon vision] image filtering

30 minutes to thoroughly understand the synchronized lock upgrade process

2022/07/25------字符串的排列

Learning about tensor (III)
![[Halcon vision] affine transformation](/img/f1/32284c71e78e6eea390fdb6058ba0f.png)
[Halcon vision] affine transformation

equals与==的区别

On the compilation of student management system of C language course (simple version)
随机推荐
Li Kou daily question 917
面试第二家公司的面试题及答案(二)
json-c库的简单使用——将json文件转换为struct.
equals与==的区别
单元测试,到底什么是单元测试,为什么单测这么难写
[Halcon vision] array
Wechat official account release reminder (wechat official account template message interface)
【Halcon视觉】图像的傅里叶变换
json_object_put: Assertion `jso->_ref_count > 0‘ failed.Aborted (core dumped)
js翻页、kkpager.js翻页
C language course design Tetris (Part 1)
algorithm
Data communication foundation STP principle
Tower of Hanoi II | tower of Hanoi 4 columns
Closure of go (cumulative sum)
RecyclerView最后一条显示不全或显示部分的问题解决
事务的传播性propagation
C language course design Tetris (Part 2)
[qualcomm][network] QTI service analysis
Cause: couldn‘t make a guess for 解决方法