0046 @Transactional注解的几个参数--事务传播控制--事务隔离级别--异常与回滚
@Transactianal注解有一些属性,见Spring-Framework-Reference Table17.3 Transactional-settings
@Transactional(propagation=Propagation.REQUIRED) //控制事务传播。默认是Propagation.REQUIRED
@Transactional(isolation=Isolation.DEFAULT) //控制事务隔离级别。默认跟数据库的默认隔离级别相同
@Transactional(readOnly=false) //控制事务可读写还是只可读。默认可读写
@Transactional(timeout=30) //控制事务的超时时间,单位秒。默认跟数据库的事务控制系统相同,又说是30秒
@Transactional(rollbackFor=RuntimeException.class) //控制事务遇到哪些异常才会回滚。默认是RuntimeException
@Transactional(rollbackForClassName=RuntimeException) //同上
@Transactional(noRollbackFor=NullPointerException.class) //控制事务遇到哪些异常不会回滚。默认遇到非RuntimeException不会回滚
@Transactional(noRollbackForClassName=NullPointerException)//同上
控制事务传播----propagation属性
事务的传播是指:
A.f1()有事务X
B.f2()有事务Y
当A.f1()调用B.f2()的时候,B.f2()中的代码执行哪个事务
该属性可能的值有(以下属性值加在B.f2()上来理解):
Propagation.NEVER:
B.f2()不能在任何事务下执行,如果A.f1()调用它,那么抛异常。绝不接受,硬给就拼命
Propagation.NOT_SUPPORTED:
B.f2()不需要在事务中执行。如果被需要事务X的A.f1()调用,那么事务X被挂起,B.f2()执行完毕X才恢复。不接受,硬给也不收
Propagation.REQUIRES_NEW:
如果A.f1()调用B.f2(),那么事务X被挂起,重新创建一个事务Y,B.f2()在事务Y中执行,Y执行完毕再继续X事务。接受,给的不收,用自己的
Propagation.SUPPORTS:
如果B.f2()被A.f1()调用,那么执行X事务;如果被没有事务的方法调用,那么就在没有事务的环境下执行。接受,给就收下,不给也不要
Propagation.REQUIRED:
如果A.f1()调用B.f2(),那么B.f2()在事务X中执行;如果B.f2()没有被调用,那就执行自己的事务Y。接受,给就收下,不给就用自己的
Propagation.MANDATORY:
B.f2()不能开启自己的事务,只能被开启了事务的A.f1()调用,如果被没有开启事务其他的方法调用,则抛异常。自己没有,给,必须给,不给就哭
Propagation.NESTED:
看不懂
控制事务隔离级别----属性isolation
事务隔离级别是数据库的概念,在多个事务对一批记录进行操作的时候,可能出现各种冲突的情况
该属性的可能值有:
Isolation.READ_UNCOMMITED
读未提交
可以读到其他事务未提交的数据。导致脏读(dirty read)
Isolation.READ_COMMITED
读已提交。这是很多数据库的默认隔离级别,但不是MySQL的。
不能读到其他事务未提交的数据,只能读到已提交的数据。解决了脏读,可导致重读和幻读
重读:在预读之后,commit之前,其他事务更新了数据,导致两次读到的数据不相同
幻读:在预读之后,commit之前,其他事务插入数据,导致两次读到的数据条数不相同
Isolation.REPEATABLE_READ
可重复读。这是MySQL的默认事务隔离级别
解决了脏读,重读,但依然存在幻读问题。
Isolation.SERIALIZABLE
可串行化
最高的事务隔离级别。解决了脏读、重读、幻读
但导致大量的超时和锁竞争。
Isolation.DEFAULT
数据库默认隔离级别
只可读/可读写
有的事务不涉及到写操作,就可以将其指定为只读事务:@Transactional(readOnly=true),这样可以节约一些资源开销
默认是可读写
遇到哪些异常会回滚和不回滚----rollbackFor和noRollbackFor属性
默认在遇到RuntimeException的时候会回滚。
如果要指定在遇到checkedException的时候也回滚
@Transactional(rollbackFor={IOException.class,FileNoteFoundException})
多个异常类型,用数组
如果要指定遇到几个RuntimeException的时候不回滚
@Transactional(noRollbackFor={NullPointerException.class,IndexOutOfBoundsException.class})
多个异常类型,用数组
测试的时候,抛出了Transaction rolled back because it has been marked as rollback-only,暂不知道原因
其他:
@Transaction应当添加在具体的实现类而不是接口上
0046 @Transactional注解的几个参数--事务传播控制--事务隔离级别--异常与回滚的更多相关文章
- Spring的事务传播性与隔离级别以及实现事物回滚
一.事务的四个特性(ACID) 原子性(Atomicity):一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做,要么全部做. 一致性(Consistency): 数据不会因为事务的执行而 ...
- Spring事务传播机制与隔离级别(转)
Spring事务传播机制与隔离级别 博客分类: Spring 转自:http://blog.csdn.net/edward0830ly/article/details/7569954 (写的不错) ...
- spring事务传播属性和隔离级别
猫咪咪的Java世界 spring事务传播属性和隔离级别 博客分类: Spring java编程 1 事务的传播属性(Propagation) 1) REQUIRED ,这个是默认的属性 Supp ...
- 浅析Spring事务传播行为和隔离级别
7个传播行为.4个隔离级别. Spring事务的传播行为和隔离级别[transaction behaviorand isolatedlevel] Spring中事务的定义: Propagation(k ...
- Spring中的事务传播行为与隔离级别
事务传播行为 事务传播行为(为了解决业务层方法之间互相调用的事务问题): 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播.例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己 ...
- spring的事务传播行为与隔离级别
具体请参考blog:https://bbs.csdn.net/topics/391875990 要明白2个概念: 1.“spring的事务传播属性” 2.“spring的事务隔离级别” 例如正常的sp ...
- spring事务之事务传播机制和隔离级别
Spring事务传播行为 运用Spring事务,必须要深入理解它的传播机制,否则会遇到各种意想不到的坑,Spring定义了七种传播行为. public interface TransactionDef ...
- spring事务传播性与隔离级别
事务的7种传播级别: 1)PROPAGATION_REQUIRED:支持当前事务,没有事务就新建一个. 2)PROPAGATION_SUPPORTS:支持当前事务,如果没有事务,以非事务方式处理 3) ...
- spring 事务传播特性 和隔离级别
事务的几种传播特性1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务.如果没有事务则开启2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务 ...
随机推荐
- synchronized 线程同步
synchronized 通常用来形容一次方法的调用,调用一旦开始,调用者必须等到方法调用返回后,才能继续执行后续的操作. 1.demo package demo1; public class My ...
- OTL调用存储过程/函数及注意事项
OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个 C++ 编译中操控关系数据库的模板库,它目前几乎支持所有的当前各种主流数据库. OTL ...
- third-maximum-number
https://leetcode.com/problems/third-maximum-number/ // 开始我以为相同的也占一位,比如5,3,3,2,得出3,但是答案是需要2 public cl ...
- 捕获和记录SQL Server中发生的死锁
经带在论坛上看到有人在问怎么捕获和记录死锁信息,在这里,我将自己的一些心得贡献出来,与大家分享,也请各位指正. 我们知道,可以使用SQL Server自带的Profiler工具来跟踪死锁信息.但这种方 ...
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
双向循环链表是基于双向链表的基础上实现的,和双向链表的操作差不多,唯一的区别就是它是个循环的链表,通过每个节点的两个指针把它们扣在一起组成一个环状.所以呢,每个节点都有前驱节点和后继节点(包括头节点和 ...
- 深度增强学习--A3C
A3C 它会创建多个并行的环境, 让多个拥有副结构的 agent 同时在这些并行环境上更新主结构中的参数. 并行中的 agent 们互不干扰, 而主结构的参数更新受到副结构提交更新的不连续性干扰, 所 ...
- MySQL : ERROR 1042 (HY000): Can't get hostname for your address
摘自: http://www.siutung.org/post/506/ 使用Navicat for MySQL连接远程的MySQL服务器,却提示:Can't get hostname for you ...
- Hadoop数据目录迁移
Hadoop数据目录迁移 @(Hadoop) 随着数据的不断导入和增大,原本集群部署的目录磁盘空间不足了,所以要把hadoop存储数据的位置迁移到另外一个巨大的磁盘上,另外的一个用意是将数据和程序分离 ...
- errno , perror,strerror
1. 简介 很多系统函数在错误返回时将错误原因记录在libc定义的全局变量errno中,每种错误原因对应一个错误码. errno在头文件errno.h中声明,是一个整型变量,所有错误码都是正整数. 然 ...
- (转)dubbo design
框架设计 整体设计 图例说明: 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口, 位于中轴线上的为双方都用到的接口. 图中从下至上分为十层,各层均为单向依赖,右边的黑 ...