spring事务传播的Propagation.REQUIRES_NEW以及NEVER MANDATORY验证,及其失效的诡异问题
NEVER
不使用事务,如果当前事务存在,则抛出异常
验证:
@Service
public class PrService {
@Autowired
PrDao dao;
@Transactional
public void savea() {
dao.a();//保存第一条数据
saveb();
}
@Transactional(propagation = Propagation.NEVER)
private void saveb() {
dao.b();//保存第二条数据
int i=1/0;
}
}
写一个controller调用这个savea方法,页面看到的是/ by zero,数据库中两条数据都没有插入进去,都回滚了。照说设置了Propagation.NEVER,应该saveb方法根本执行不了,报never的错。为什么执行了呢?
因为是直接调用的saveb(),不是从代理对象上调用的方法,改成这样:
@Service
public class PrService {
@Autowired
PrDao dao; @Autowired
PrService prService; @Transactional
public void savea() {
dao.a();//保存第一条数据
prService.saveb();
} @Transactional(propagation = Propagation.NEVER)
private void saveb() {
dao.b();//保存第二条数据
int i=1/0;
}
}
注意这里是 prService.saveb()和前面不同,但是居然在 dao.b(); 这一行报了一个空指针的错误,这就诡异了,这个dao明明上a方法里面还有值的,你知道是为什么吗?
原来b方法的修饰符是private,导致代理对象无法继承这个方法。改成public
public void saveb()
再次测试,看到期待的报错了:
Existing transaction found for transaction marked with propagation 'never'
MANDATORY
当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常。
这里把MANDATORY放在b方法上,就要把a方法上的transactional注解去掉,才能看到报错。
@Service
public class PrService {
@Autowired
PrDao dao; @Autowired
PrService prService; public void savea() {
dao.a();//保存第一条数据
prService.saveb();
} @Transactional(propagation = Propagation.MANDATORY)
public void saveb() {
dao.b();//保存第二条数据
}
}
或者直接把MANDATORY放在a方法上也会报错:
@Service
public class PrService {
@Transactional(propagation = Propagation.MANDATORY)
public void savea() {
}
}
报错如下
No existing transaction found for transaction marked with propagation 'mandatory'
REQUIRES_NEW
创建一个新事务,如果存在当前事务,则挂起该事务。
可以理解为设置事务传播类型为REQUIRES_NEW的方法,在执行时,不论当前是否存在事务,总是会新建一个事务。
现在写一个demo验证,a方法调用b方法,希望b方法里面异常了且事务回滚,a方法里面不回滚
下面验证:
同样为了在避免事务失效,在代理对象上调用方法,将被调用的方法放到一个单独的类中:
@Service
public class PrService {
@Autowired
PrDao dao; @Autowired
SaveBService saveBService; @Transactional
public void savea() {
dao.a();//插入第一条数据
saveBService.saveb();
}
}
@Service
public class SaveBService {
@Autowired
PrDao dao; @Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveb() {
dao.b();//插入第二条数据
int i = 1/0;
}
}
这里PrService的savea方法调用SaveBService的saveb方法,写一个controller访问savea方法,页面看到一个异常 / by zero,再检查数据库,两条数据都有没有插入进去。这是为什么呢?看上去第二个方法已经写到独立的类中了。
原来是因为b方法抛出的异常a方法没有捕获,又抛出去了,当然要回滚了。写个try catch就行:
@Transactional
public void savea() {
dao.a();//插入第一条数据
try {
saveBService.saveb();
}catch (Exception e) {
System.out.println("some error");
}
}
再次测试,第二条数据没有插入,第一条数据插入到数据库了,页面也看不到报错了。
spring事务传播的Propagation.REQUIRES_NEW以及NEVER MANDATORY验证,及其失效的诡异问题的更多相关文章
- spring 事务传播(Propagation)
propagation 一共有以下几种选项: 1. REQUIRED(默认): 使用当前的事务,如果当前没有事务,则自己新建一个事务,子方法必须运行在一个事务中:如果当前存在事务,则加入这个事务,成为 ...
- spring事务传播行为之使用REQUIRES_NEW不回滚
最近写spring事务时用到REQUIRES_NEW遇到一些不回滚的问题,所以就记录一下. 场景1:在一个服务层里面方法1和方法2都加上事务,其中方法二设置上propagation=Propagati ...
- spring事务传播机制实例讲解
http://kingj.iteye.com/blog/1680350 spring事务传播机制实例讲解 博客分类: spring java历险 天温习spring的事务处理机制,总结 ...
- spring 事务传播机制
spring 事务 传播机制 描述的 事务方法直接相互调用,父子事物开启,挂起,回滚 等的处理方式. 绿色的 那几个 我认为比较重要. 1 , @Transactional(propagation=P ...
- spring 事务传播行为实例分析
Spring事务传播行为: spring特有的事务传播行为,spring支持7种事务传播行为,确定客户端和被调用端的事务边界(说得通俗一点就是多个具有事务控制的service的相互调用时所形成的复杂的 ...
- Spring 事务传播行为的使用
...
- 理解 spring 事务传播行为与数据隔离级别
事务,是为了保障逻辑处理的原子性.一致性.隔离性.永久性. 通过事务控制,可以避免因为逻辑处理失败而导致产生脏数据等等一系列的问题. 事务有两个重要特性: 事务的传播行为 数据隔离级别 1.事务传播行 ...
- spring事务传播行为的思考
1.问题 @TransactionConfiguration(transactionManager = "txManager", defaultRollback = false) ...
- spring事务传播行为讲解转载
https://segmentfault.com/a/1190000013341344 前言 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为.事务传播行为是 ...
- spring事务传播属性和隔离级别
猫咪咪的Java世界 spring事务传播属性和隔离级别 博客分类: Spring java编程 1 事务的传播属性(Propagation) 1) REQUIRED ,这个是默认的属性 Supp ...
随机推荐
- vs2019配置boost库(转载)
网址:https://blog.csdn.net/qq_42214953/article/details/105087015 关于途中的执行文件,可以使用b2.exe,不用跟着教程走. 如果本来就有b ...
- 华大单片机HC32L13X软件设计时候要注意的事项
1.系统启动时默认设置主频为内部4MHz; 2.调试超低功耗程序或者把SWD端口复用为GPIO功能都会把芯片的SWD功能关掉,仿真器将会与芯片失去连接,建议在main函数开始后加上1到2秒的延时,仿真 ...
- 干货 | BitSail Connector 开发详解系列一:Source
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 BitSail 是字节跳动自研的数据集成产品,支持多种异构数据源间的数据同步,并提供离线.实时.全量.增量场景下全 ...
- 从零开始学习Java系列之Java运行机制与跨平台特性
全文大约[4000]字,不说废话,只讲可以让你学到技术.明白原理的纯干货!并带有丰富的案例及配图,让你更好地理解和运用文中的技术概念,给你带来具有足够启迪的思考-- 在上一篇文章中,壹哥给大家介绍了J ...
- 非常强大实用的键盘改键工具 - MapKeyboard
MapKeyboard可以重新定义键盘上的键位,对于使用笔记本或非标准101键盘的用户来说,是一个很有用的键盘改键工具.当你重新定义完键位,改变将被明显的标注出来,即使重启也不会改变.它不需安装,也可 ...
- 算法学习笔记(20): AC自动机
AC自动机 前置知识: 字典树:可以参考我的另一篇文章 算法学习笔记(15): Trie(字典树) KMP:可以参考 KMP - Ricky2007,但是不理解KMP算法并不会对这个算法的理解产生影响 ...
- 为什么说 ICMP 协议是网络最强辅助
大家好,我是风筝 轻解网络系列又来了.已有高清 PDF 版本可以离线阅读了,全册 65 页,如果有需要离线版的高清 PDF 可以直接下载. 今天咱们说说 ICMP 协议.ICMP 可谓是网络世界中的最 ...
- Oracle_用户-授权-角色
Oracle创建用户及表空间 1. 用户 创建用户: sql> create user <用户名> IDENTIFIED BY <用户密码> default tables ...
- 鼎捷ERP二次开发教程 Tiptop GP开发资料大全 Tipto开发实战经验 鼎捷开发实战例子 Tiptop GP二次开发项目例子 4GL开发Demo 鼎捷二次开发完整例子 鼎捷ERP二次开发入门
本人在ERP实施公司做顾问四五年,参与企业实施ERP十多个项目,非常熟悉企业ERP流程,在实施过程遇到众多问题,提出了不少根据企业具体情况的解决方案. 曾经参与鼎捷Tiptop GP实施十多个项目,具 ...
- Django之admin后台管理
目录 创建超级用户 向页面中添加表 admin管理页面表名中文显示 创建超级用户 python manage.py createsuperuser 向页面中添加表 登录后,页面中是什么都没有的,还需要 ...