浅谈spring 声明式事物
此处主要讲讲事物的属性。
事物属性包含了五个方面:
1.传播行为
2.隔离规则
3.回滚规则
4.事物超时
5.是否只读
一.传播行为
事务的第一个方面是传播行为(propagation behavior)。当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。spring定义了七种传播行为。
1.1 PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
1.2 PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
1.3 PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
1.4 PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
1.5 PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
1.6 PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
1.7 PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
列:

数据库中有表smts_user_device_info_tmp,字段:USER_ID,DEVICE_TYPE,DEVICE_ID默认都是1.
dao中有三个方法,test1():用来更新user_id=2,test2():用来更新DEVICE_TYPE=2,test3():用来更新DEVICE_ID=2
1.service方法如下:
@Component("testService")
public class TestServiceImpl implements TestService {
@Autowired
private AnnuityApplicationDao annuityApplicationDao;
@Autowired
private Test2Service test2Service;
@Override
@Transactional(propagation= Propagation.REQUIRED)
public void fun1() throws Exception {
annuityApplicationDao.test1();
int i = 1/0;
annuityApplicationDao.test2();
}
public void fun2() throws Exception{
annuityApplicationDao.test3();
fun1();
}
}
若执行fun1()方法,结果如下:事物回滚

若执行fun2()方法,结果如下:

发现事物没起作用,原因可参照:http://blog.csdn.net/seelye/article/details/40144817
若fun1(),fun2()不是在一个类内,会发现事物是起作用的。
在fun2()上注解事物,调用fun2(),环境中没有事物,会新建一个事物,当在fun2中调用fun1时,环境中已经有了事物,则fun1加入当前事物。
2.service方法如下:
@Component("testService")
public class TestServiceImpl implements TestService {
@Autowired
private AnnuityApplicationDao annuityApplicationDao;
@Autowired
private Test2Service test2Service;
@Override
@Transactional(propagation= Propagation.SUPPORTS)
public void fun1() throws Exception {
annuityApplicationDao.test1();
int i = 1/0;
annuityApplicationDao.test2();
}
@Transactional(propagation = Propagation.REQUIRED)
public void fun2() throws Exception{
annuityApplicationDao.test3();
fun1();
}
}
单独调用fun1,事物没有执行,当调用fun2,fun1加入了fun2的事物执行。
3. service如下:
@Component("testService")
public class TestServiceImpl implements TestService {
@Autowired
private AnnuityApplicationDao annuityApplicationDao;
@Autowired
private Test2Service test2Service;
@Override
@Transactional(propagation= Propagation.MANDATORY)
public void fun1() throws Exception {
annuityApplicationDao.test1();
annuityApplicationDao.test2();
}
@Transactional(propagation = Propagation.REQUIRED)
public void fun2() throws Exception{
annuityApplicationDao.test3();
fun1();
}
}
当单独调用fun1,因为当前没有事物,所以抛出异常,当执行fun2,fun1加入fun2当前事物执行。
浅谈spring 声明式事物的更多相关文章
- Spring声明式事物原理分析
基础准备 pom <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www. ...
- Spring学习之声明式事物管理
public List<Student> selectStudent() { Student s = new Student(); s.setName("zhengbin&quo ...
- SSH学习——声明式事物管理(Spring)
1.什么是事物? 事务是一组操作的执行单元,相对于数据库操作来讲,事务管理的是一组SQL指令,比如增加,修改,删除等,事务的一致性,要求,这个事务内的操作必须全部执行成功,如果在此过程种出现了差错,比 ...
- 【spring基础】spring声明式事务详解
一.spring声明式事务 1.1 spring的事务管理器 spring没有直接管理事务,而是将管理事务的责任委托给JTA或相应的持久性机制所提供的某个特定平台的事务实现.spring容器负责事物的 ...
- spring5 源码深度解析----- @Transactional注解的声明式事物介绍(100%理解事务)
面的几个章节已经分析了spring基于@AspectJ的源码,那么接下来我们分析一下Aop的另一个重要功能,事物管理. 事务的介绍 1.数据库事物特性 原子性多个数据库操作是不可分割的,只有所有的操作 ...
- Spring-Security (学习记录七)--实现FilterInvocationSecurityMetadataSource的类将无法切入声明式事物
目录 1 查看继承关系 2 说明 3 查看源码: 实现了FilterInvocationSecurityMetadataSource 的类将无法切入声明式事物. 原因: 1 查看继承关系 先查看Fil ...
- Spring Data JPA系列4——Spring声明式数事务处理与多数据源支持
大家好,又见面了. 到这里呢,已经是本SpringData JPA系列文档的第四篇了,先来回顾下前面三篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring ...
- spring声明式事务管理总结
事务配置 首先在/WEB-INF/applicationContext.xml添加以下内容: <!-- 配置事务管理器 --> <bean id="transactionM ...
- spring 声明式事务管理
简单理解事务: 比如你去ATM机取5000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉5000元钱:然后ATM出5000元钱.这两个步骤必须是要么都执行要么都不执行.如果银行卡扣除了5000块但 ...
随机推荐
- css学习笔记(1)
为什么要重新学css,理由有很多,css这个小婊砸,接触至今已有三年,但真的说熟练恐怕不见得.特此,为了我的目标,开始重新整理css的知识,我希望,每一篇笔记都能有个例子,从而来巩固我的知识. 在学习 ...
- matlab中数组创建方法
创建数组可以使用 分号 : 逗号, 空格 数组同行用 逗号,或空格分割 不同行元素用 分号: clc; a = [ ]; b1 = a();%第3个元素 b2 = a(:)%第2//4个元素 b3 ...
- 练习JavaScript实现梯形乘法表
效果: 表格用html中的table,tr,td,然后利用for语句实现,循环输出行和列,再根据行列的数量进行乘法运算,第一个for循环输出9行,然后内嵌一个for,在条件表达式中取第一个for循环的 ...
- Android源码——AsynTask
AsyncTask<Params, Progress, Result>中三个参数为: Params 输入数据 Progress 过程数据 Result ...
- nginx服务器http重定向到https的正确写法
http重定向到https使用了nginx的重定向命令.那么应该如何写重定向?之前老版本的nginx可能使用了以下类似的格式. rewrite ^/(.*)$ http://domain.com/$1 ...
- bootstrap学习笔记--bootstrap布局方式
Bootstrap 3 是移动设备优先的,在这个意义上,Bootstrap 代码从小屏幕设备(比如移动设备.平板电脑)开始,然后扩展到大屏幕设备(比如笔记本电脑.台式电脑)上的组件和网格. 移动设备优 ...
- js控制文本框只能输入中文、英文、数字与指定特殊符号.
先在'' 里输入 onkeyup="value=value.replace(/[^\X]/g,'')" 然后在(/[\X]/g,'')里的 X换成你想输入的代码就可以了, 中文u4 ...
- [Android]学习笔记Activity_001
操作button的说明 设置button的ID: android:id="@+id/button" 设置button的点击事件 findViewById(R.id.button). ...
- QEMU VCPU热插特性
最近学习QEMU中VCPU热插特性,需要了解QEMU中VCPU热插的整个流程,VCPU热插是QEMU主板的一个feature. 1:这里先分析一下QEMU的主板模拟,主板在QEMU的设备模型中对应的是 ...
- Android源代码查看途径
作为一个android coder,多阅读android源码对提高android开发水平是很有帮助的,那么我们可以通过哪些途径查看android源码呢 1.如果你能够FQ的话可以去android官网查 ...