云笔记项目-Spring事务学习-传播NOT_SUPPORTED
接下来测试事务传播属性设置为NOT_SUPPORTED
Service层
Service层主要设置如下,其中还插入了REQUIRED作为比较。
package Service; import javax.annotation.Resource; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import DAO.EmpDAO;
import Entity.EMP; @Service("service1")
public class EMPService1Impl implements EMPService1{ @Resource(name="empDAO")
EmpDAO dao; @Transactional(propagation=Propagation.NOT_SUPPORTED)
public void addEmp1(EMP emp) {
dao.addEMP1(emp);
} }
package Service; import javax.annotation.Resource; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import DAO.EmpDAO;
import Entity.EMP; @Service("service2")
public class EMPService2Impl implements EMPService2{ @Resource(name="empDAO")
EmpDAO dao; @Transactional(propagation=Propagation.REQUIRED)
public void addEmp2(EMP emp) {
dao.addEMP2(emp);
} @Transactional(propagation=Propagation.NOT_SUPPORTED)
public void addEmp2WithException(EMP emp) {
dao.addEMP2(emp);
throw new RuntimeException();
} }
LayerT层代码
package LayerT; import javax.annotation.Resource; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import Entity.EMP;
import Service.EMPService1;
import Service.EMPService2;
@Component("noteSupportedTest")
public class NotSupportedTest {
@Resource(name="service1")
EMPService1 service1;
@Resource(name="service2")
EMPService2 service2;
/**
* 外层方法没有事务,但是抛出异常
* @param emp1
* @param emp2
*/
public void testNotSupportWithoutTransaction1(EMP emp1,EMP emp2) {
service1.addEmp1(emp1);
service2.addEmp2(emp2);
throw new RuntimeException();
}
/**
* 外层方法没有事务,内层方法抛出异常
* @param emp1
* @param emp2
*/
public void testNotSupportWithoutTransaction2(EMP emp1,EMP emp2) {
service1.addEmp1(emp1);
service2.addEmp2WithException(emp2);
}
/**
* 外层方法有事务,并且抛出异常
* @param emp1
* @param emp2
*/
@Transactional
public void testNotSupportWithTransaction1(EMP emp1,EMP emp2) {
service1.addEmp1(emp1);//not_supported
service2.addEmp2(emp2);//required
throw new RuntimeException();
}
/**
* 外层方法有事务,并且内存方法抛出异常
* @param emp1
* @param emp2
* @param emp3
*/
@Transactional
public void testNotSupportWithTransaction2(EMP emp1,EMP emp2, EMP emp3) {
service1.addEmp1(emp1);//not_supported
service2.addEmp2(emp2);//required
service2.addEmp2WithException(emp3);//not_supported
}
}
测试代码
package TestCase; import org.junit.Test; import Entity.EMP;
import LayerT.NotSupportedTest; public class notSupportedTestCase extends baseTest{
@Test
public void test1() {
NotSupportedTest T1=ac.getBean("noteSupportedTest",NotSupportedTest.class);
EMP emp1=new EMP("张三",18);
EMP emp2=new EMP("李四",28);
T1.testNotSupportWithoutTransaction1(emp1, emp2);
}
@Test
public void test2() {
NotSupportedTest T1=ac.getBean("noteSupportedTest",NotSupportedTest.class);
EMP emp1=new EMP("张三",18);
EMP emp2=new EMP("李四",28);
T1.testNotSupportWithoutTransaction2(emp1, emp2);
}
@Test
public void test3() {
NotSupportedTest T1=ac.getBean("noteSupportedTest",NotSupportedTest.class);
EMP emp1=new EMP("张三",18);
EMP emp2=new EMP("李四",28);
T1.testNotSupportWithTransaction1(emp1, emp2);
}
@Test
public void test4() {
NotSupportedTest T1=ac.getBean("noteSupportedTest",NotSupportedTest.class);
EMP emp1=new EMP("张三",18);
EMP emp2=new EMP("李四",28);
EMP emp3=new EMP("王五",22);
T1.testNotSupportWithTransaction2(emp1, emp2, emp3);
}
}
测试结果
(1)外层方法没有事务
test1 | 张三插入,李四插入 |
test2 | 张三插入,李四插入 |
结论:当外层方法没有事务时,内层方法按照非事务方式执行。
(2)外层方法有事务
test3 | 张三插入,李四未插入 |
test4 | 张三插入,李四未插入,王五插入 |
结论:当外层方法事务传播属性设置为默认,只有声明REQUIRED的那个方法会受外层方法的影响,导致李四未插入,但是内层方法事务声明为NOT_SUPPORTED的方法,不论内层还是外层方法有异常,都不开启事务,出错也提交事务。
参考博文:https://segmentfault.com/a/1190000013341344
云笔记项目-Spring事务学习-传播NOT_SUPPORTED的更多相关文章
- 云笔记项目-Spring事务学习-传播Requried
在准备好前期的项目搭建后,接下来就一个个的测试,首先测试事务传播的Required Service层两个实现类 Service层两个实现类,只是更换了方法事务传播的属性,其他都一样,后续测试也只修改传 ...
- 云笔记项目-Spring事务学习-传播SUPPORTS
接下来测试事务传播属性SUPPORTS Service层 Service层将方法的事务传播属性设置为SUPPORTS LayerT层代码 package LayerT; import javax.an ...
- 云笔记项目-Spring事务学习-传播NEVER
接下来测试事务传播属性NEVER Service层 Service层中设置事务传播属性都为NEVER. LayerT层代码 package LayerT; import javax.annotatio ...
- 云笔记项目-Spring事务学习-传播MANDATORY
接下来测试事务传播属性MANDATORY Service层 所有Service层实现类都设置事务传播属性为MANDATORY. LayerT层代码 package LayerT; import jav ...
- 云笔记项目-Spring事务学习-传播NESTED
接下来测试事务传播属性NESTED Service层 Service层方法事务传播属性都设置为NESTED. LayerT层代码 package LayerT; import javax.annota ...
- 云笔记项目-Spring事务学习-传播REQUIRES_NEW
接下来测试事务传播的REQUIRES_NEW. Service层 Service层代码在这里不展示了,主要将EMPService1Impl类中的方法事务传播属性设置为REQUIRED,EMPServi ...
- 云笔记项目-Spring事务学习_测试准备
在做云笔记项目的过程中,顺便简单的学习了Spring的事务概念,业务以如果添加笔记,则增加用户星星数目作为例子,引入了事务的概念.类似注册送积分之类的,云笔记项目以增加笔记就送星星来说明事务.具体在添 ...
- Spring事务的传播行为 @Transactional(转)
Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例 ...
- Spring事务的传播行为 @Transactional
Spring事务的传播行为http://blog.csdn.net/cuker919/article/details/5957209 在service类前加上@Transactional,声明这个se ...
随机推荐
- PCI9054 总结(讲解非常清楚)
转载自:http://blog.csdn.net/lg2lh/article/details/8042008 PCI的基本协议这里就不介绍了,因为一般的芯片协议都是集成好的,我只需要大体了解就行,不需 ...
- TypeScript安装备忘:npm proxy设置
如果使用了代理网络,因为npm无法自动识别Internet代理,则需要手动设置npm代理才能下载包. 设置命令: npm config set proxy http://proxyhost:pr ...
- Visual Studio Code 使用 Git插件报错 - Permission denied (publickey)
在使用GitHub的时候,为了避免每次输入用户名密码,都会使用SSH方式代替Https. 按网上教程,大多数使用SSH-KeyGen生成公私钥对,而后上传公钥至Github,并切换Repositori ...
- Solr4.7.0连接MySQL
1.把Mysql的Jar包 例如:mysql-connector-java-5.1.8-bin.jar 或其他版本 放到D:\apache-tomcat-7.0.57\webapps\solr\W ...
- ES - Index Templates 全局index模板
1.Index Templates 之前我们聊过Dynamic template,它作用范围是特定的Index,如果我们想针对全局Index进行设置该如何操作呢? Index Templates 可以 ...
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)解答
我在使用mysqll客户端连接我的mysql服务器的时候,出现了上述的问题.我的操作系统是ubuntu,安装版本是对应的64位服务器.我的服务器的启动方式是sudo service mysql sta ...
- Java Lambda expression
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lambda 表达式可以使代码变的更加 ...
- 踩坑之VC报错 error RC2104 : undefined keyword or key name
.RC文件中第541行 MENUITEM "CNDev, ID_CNDEV 少了一个" 正确的应该是MENUITEM " ...
- 理解block和inode
什么是block和inode? 定义:block就像是杯子 inode就像是杯子的编号,因为杯子太多了 1.根据文件的大小,在磁盘中储存时会占用一个或多个block:那么究竟多大的文件会使用一个blo ...
- Sublime Text 3安装Package Control
Package Control官网:https://packagecontrol.io/installation#st3 ctrl + ` 或者 View > Show Console呼出控制台 ...