spring事务有7种传播行为,分别是:

1、PROPAGATION.REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。

2、PROPAGATION.SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘

3、PROPAGATION.MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。

4、PROPAGATION.REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。

5、PROPAGATION.NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

6、PROPAGATION.NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

7、PROPAGATION.NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

注解@Transactional默认的传播行为是:PROPAGATION.REQUIRED

若需要设置其他传播行为,设置方法如下:

@Transactional(propagation = Propagation.REQUIRED)
public void test() {
//...
}

上面的设置的作用是:当方法test出现 “运行时异常” 时,会进行事务回滚(其实是伪回滚,只是把之前的操作改回去。比如有插入操作且是主键是自增长的,假设插入一条记录的操作前,下一id的值是1,但伪回滚后,就变成2了,也就是说,下一次成功插入后,id的值是2而不是1)。

但是如果,在test方法的方法体中捕获了异常,则不会对事务进行回滚,代码如下:

@Transactional
public void test() {
try{
//...
} catch(DataAccessException e) {
e.printStackTrace();
}
}

上边的代码,如果对多个表进行操作,有成功也有失败的操作,但最后,成功的操作不会被回滚,因为异常被捕获了,spring捕获不到,也就没办法回滚了。

要想既捕获异常然后做一些操作,又想对失败的操作进行回滚,可以在捕获异常后,再对异常抛出,即让spring能捕获该异常 ,示例如下:

@Transactional
public void test() {
try{
//...
} catch(DataAccessException e) {
e.printStackTrace();
throw e;
}
}

另外,被@Transactional注解的方法,spring不止对捕获数据访问异常才会进行回滚,而是只要捕获到了运行时异常都会进行回滚,比如下面的示例:

@Transactional
public void test() {
try{
//...
int [] counts = new int[]{1};
int count = counts[1];
} catch(RuntimeException e) {
e.printStackTrace();
throw e;
}
}

上边的代码,会报数组下标越界的“运行时异常” ,但被捕获了,就算之前对数据库的操作是成功的,之前对数据库的操作还是会被回滚。

暂时到这里,以后遇到新问题再补充。

spring@Transactional的一点理解的更多相关文章

  1. Java:Spring @Transactional工作原理

    本文将深入研究Spring的事务管理.主要介绍@Transactional在底层是如何工作的.之后的文章将介绍: propagation(事务传播)和isolation(隔离性)等属性的使用 事务使用 ...

  2. Spring @Transactional (一)

    Spring @Transactional (一) 博客分类: JAVA SpringJPAJDBCUPSQL  Spring事务的传播行为 在service类前加上@Transactional,声明 ...

  3. 25.Spring @Transactional工作原理

    转自:http://www.importnew.com/12300.html 本文将深入研究Spring的事务管理.主要介绍@Transactional在底层是如何工作的.之后的文章将介绍: prop ...

  4. 数据库事务中的隔离级别和锁+spring Transactional注解

    数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题.ACID首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(At ...

  5. [转]数据库事务中的隔离级别和锁+spring Transactional注解

    数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题.ACID首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(At ...

  6. spring Ioc/DI的理解

    学习spring的童鞋都知道,spring中有两个非常重要的点,Ioc(控制反转)与DI(依赖注入),对于初级玩家来说,这两个概念可能有点模棱两可的感觉,今天就谈下自己的一点理解,不足请多多指教!!! ...

  7. How does Spring @Transactional Really Work?--转

    原文地址:http://blog.jhades.org/how-does-spring-transactional-really-work/ In this post we will do a dee ...

  8. opencv笔记5:频域和空域的一点理解

    time:2015年10月06日 星期二 12时14分51秒 # opencv笔记5:频域和空域的一点理解 空间域和频率域 傅立叶变换是f(t)乘以正弦项的展开,正弦项的频率由u(其实是miu)的值决 ...

  9. 对socket的一点理解笔记

    需要学web service,但是在视频中讲解到了socket套接字编程.以前貌似课上老师有提过,只是没用到也感觉乏味.现在遇到,自己看了些博客和资料.记录一点理解,不知正确与否. 首先说这个名字,叫 ...

随机推荐

  1. mfc 类三种继承方式下的访问

    知识点 public private protected 三种继承方式 三种继承方式的区别 public 关键字意味着在其后声明的所有成员及对象都可以访问. private 关键字意味着除了该类型的创 ...

  2. 德哥的PostgreSQL私房菜 - 史上最屌PG资料合集

    德哥的PostgreSQL私房菜 - 史上最屌PG资料合集

  3. 【HNOI2016】序列

    题面 题解 设\([l, r]\)的最小值的位置为\(p\),那么对于左端点在区间\([l, p]\),右端点在区间\([p, r]\)的区间最小值都为\(a[p]\). 这一部分的贡献就是\(a[p ...

  4. android全屏

    this.requestWindowFeature( Window.FEATURE_NO_TITLE ); this.getWindow().setFlags(WindowManager.Layout ...

  5. Lambda学习---StreamApi使用

    package com.zx; import com.zx.entity.Book; import org.junit.Test; import java.time.LocalDate; import ...

  6. node.js学习笔记(四)——EventEmitter

    error 事件 EventEmitter 定义了一个特殊的事件 error,它包含了错误的语义,我们在遇到异常的时候通常会触发 error 事件.当 error 被触发时,EventEmitter ...

  7. laraver框架学习

    最近开始学习laravel框架,这个框架在国外很流行,近些年开始在国内流行.自己而是刚开始学习这个框架. 使用composer 更新系统内的依赖包 在终端输入:composer update Entr ...

  8. SpringBoot整合Mybatis之进门篇

    已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...

  9. OpenState: Programming Platform-independent Stateful OpenFlow Applications Inside the Switch

    文章名称:OpenState: Programming Platform-independent Stateful OpenFlow Applications Inside the Switch Op ...

  10. week6:个人博客作业

    这周主要是参与团队编程的讨论 团队编程中发现很多问题: 1,每个人共同空闲的时间不好找 就我组来说,我是考研,每天晚上都要去外面上课,有的人在进行大创,,也有的像我一样在整考研的东西,还有的进行其他, ...