@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注解的几个参数--事务传播控制--事务隔离级别--异常与回滚的更多相关文章

  1. Spring的事务传播性与隔离级别以及实现事物回滚

    一.事务的四个特性(ACID) 原子性(Atomicity):一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做,要么全部做. 一致性(Consistency): 数据不会因为事务的执行而 ...

  2. Spring事务传播机制与隔离级别(转)

    Spring事务传播机制与隔离级别 博客分类: Spring   转自:http://blog.csdn.net/edward0830ly/article/details/7569954 (写的不错) ...

  3. spring事务传播属性和隔离级别

    猫咪咪的Java世界 spring事务传播属性和隔离级别 博客分类: Spring java编程   1 事务的传播属性(Propagation) 1) REQUIRED ,这个是默认的属性 Supp ...

  4. 浅析Spring事务传播行为和隔离级别

    7个传播行为.4个隔离级别. Spring事务的传播行为和隔离级别[transaction behaviorand isolatedlevel] Spring中事务的定义: Propagation(k ...

  5. Spring中的事务传播行为与隔离级别

    事务传播行为 事务传播行为(为了解决业务层方法之间互相调用的事务问题): 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播.例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己 ...

  6. spring的事务传播行为与隔离级别

    具体请参考blog:https://bbs.csdn.net/topics/391875990 要明白2个概念: 1.“spring的事务传播属性” 2.“spring的事务隔离级别” 例如正常的sp ...

  7. spring事务之事务传播机制和隔离级别

    Spring事务传播行为 运用Spring事务,必须要深入理解它的传播机制,否则会遇到各种意想不到的坑,Spring定义了七种传播行为. public interface TransactionDef ...

  8. spring事务传播性与隔离级别

    事务的7种传播级别: 1)PROPAGATION_REQUIRED:支持当前事务,没有事务就新建一个. 2)PROPAGATION_SUPPORTS:支持当前事务,如果没有事务,以非事务方式处理 3) ...

  9. spring 事务传播特性 和隔离级别

    事务的几种传播特性1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务.如果没有事务则开启2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务 ...

随机推荐

  1. iOS:quartz2D绘图(处理图像,绘制图像并添加水印)

    绘制图像既可以重写drawRect:方法并在该方法中绘制,也可以不用重写该方法,它有封装好的函数获取自己的图像绘制上下文,即UIGraphicsBeginImageContext(CGSize siz ...

  2. 吐血整理 Delphi系列书籍 118本(全)

    Delphi 教程 系列书籍 网友(老帅)整理 001_<Delhpi6数据库设计思想与实践> 002_<Delphi6应用开发指南> 003_<Delphi6开发人员指 ...

  3. Android Killer

    首先,我们先看一Android界有名的大神写关于Android反编译的博客: 郭 大 侠:http://blog.csdn.net/guolin_blog/article/details/497380 ...

  4. 多站点IIS用户安全权限设置

    如果我们为每个站点都建立一个用户,并设置该用户只有访问本站点的权限,那么就能将访问权限控制在每个站点文件夹内,旁注问题也就解决了 一.这样配置的好处? 不知大家有没有听过旁注?我简单的解释一下吧:有个 ...

  5. http 使用curl发起https请求报错的解决办法

    使用curl发起https请求的时候报错:“SSL certificate problem, verify that the CA cert is OK. Details: error:1409008 ...

  6. 第九章:Elasticsearch集群优化及相关节点配置说明

    Linux系统调优: Linux调整打开文件数(重新启动生效) 在/etc/security/limits.conf在文件中增加: * soft nofile 8192 * hard nofile 2 ...

  7. 使用MapReduce实现二度人脉搜索算法

    一,背景介绍 在新浪微博.人人网等社交网站上,为了使用户在网络上认识更多的朋友,社交网站往往提供类似“你可能感兴趣的人”.“间接关注推荐”等好友推荐的功能,其中就包含了二度人脉算法. 二,算法实现 原 ...

  8. My SqL 常用命令

    1:使用SHOW语句找出在服务器上当前存在什么数据库:mysql> SHOW DATABASES;2:2.创建一个数据库MYSQLDATAmysql> CREATE DATABASE MY ...

  9. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击激活配置进入到运行模式直接死机或蓝屏怎么办

    下载我提供的TCRtime.sys文件,替换掉TwinCAT/Driver目录下的原有文件(原有文件要小一点,这个是159KB的) 如果你同时也安装了TwinCAT3,请不要替换这个,他是398KB的 ...

  10. chromedriver Capabilities & ChromeOptions

    Capabilities are options that you can use to customize and configure a ChromeDriver session. This pa ...