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如何为程序添加标题

    1.在CMainFrame类中找到函数PreCreateWindow,在该函数中添加 cs.style &=~FWS_ADDTOTITLE;//去掉窗口的 自动标题 属性. 这句很重要不然的话 ...

  2. 汇编 push ,pop指令

    知识点:  PUSH  POP  CALL堆栈平衡  RETN指令 一.PUSH入栈指令 (压栈指令): 格式: PUSH 操作数 //sub esp,4 ;mov [esp],EBP 操作数 ...

  3. 阿里云OSS不同账号之间的迁移

    目录 一.需求说明 二.Ossimport概述 三.配置运行环境 1.配置jdk环境 2.部署方式 3.下载并部署ossimport 四.修改单机Job的配置文件local_job.cfg 五.执行迁 ...

  4. ECC检验与纠错

    引入ECC ECC:Error Checking and Correction,是一种差错检测和修正的算法. NAND闪存在生产和使用中都会有坏块产生,BBM就是坏块的管理机制.而生产坏块已经无法避免 ...

  5. zabbix设置微信报警的配置过程

    zabbix设置微信报警的配置过程 转发:https://blog.csdn.net/qq_31613055/article/details/78831607 微信企业号的申请 注册的地址https: ...

  6. idou老师教你学Istio 17 : 通过HTTPS进行双向TLS传输

    众所周知,HTTPS是用来解决 HTTP 明文协议的缺陷,在 HTTP 的基础上加入 SSL/TLS 协议,依靠 SSL 证书来验证服务器的身份,为客户端和服务器端之间建立“SSL”通道,确保数据运输 ...

  7. Win10环境配置Bitcoin Core节点

    区块链是当下比较火热的技术,我也来蹭下热度,研究一把Bitcoin Core的技术. 入门篇 一.Bitcoin Core安装 1.下载 一般有2种安装方式:源码编译安装 和 下载现成的安装包安装 源 ...

  8. PAT甲题题解-1041. Be Unique (20)-水题

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789189.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  9. BugPhobia开发篇章:Beta阶段第III次Scrum Meeting

    0x01 :Scrum Meeting基本摘要 Beta阶段第三次Scrum Meeting 敏捷开发起始时间 2015/12/15 00:00 A.M. 敏捷开发终止时间 2015/12/15 23 ...

  10. “北航Clubs” Beta版本开发目标

    Beta版本开发目标 总体设想:修复Alpha版本中的若干bug,并在Alpha版本成果之上进行进一步开发,实现社员管理.评论.站内信等功能. 1.对Alpha版本功能的更新与加强 后端实现从SQLi ...