spring @Transactional注解参数详解

https://www.cnblogs.com/caoyc/p/5632963.html

JustDo

 

随笔- 348  文章- 6  评论- 55 

博客园  首页  新随笔  新文章  联系  管理  订阅 订阅

spring @Transactional注解参数详解

事物注解方式: @Transactional

当标于类前时, 标示类中所有方法都进行事物处理 , 例子:

1 @Transactional public class TestServiceBean implements TestService {}

当类中某些方法不需要事物时:

复制代码

 1 @Transactional  
 2 public class TestServiceBean implements TestService { 
 3     private TestDao dao; 
 4     public void setDao(TestDao dao) { 
 5         this.dao = dao; 
 6     } 
 7     @Transactional(propagation =Propagation.NOT_SUPPORTED)
 8     public List getAll() { 
 9         return null; 
10     } 
11 }

复制代码

 

事物传播行为介绍: 

  @Transactional(propagation=Propagation.REQUIRED) :如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
  @Transactional(propagation=Propagation.NOT_SUPPORTED) :容器不为这个方法开启事务
  @Transactional(propagation=Propagation.REQUIRES_NEW) :不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
  @Transactional(propagation=Propagation.MANDATORY) :必须在一个已有的事务中执行,否则抛出异常
  @Transactional(propagation=Propagation.NEVER) :必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
  @Transactional(propagation=Propagation.SUPPORTS) :如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.

 

事物超时设置:

  @Transactional(timeout=30) //默认是30秒

 

事务隔离级别:

  @Transactional(isolation = Isolation.READ_UNCOMMITTED):读取未提交数据(会出现脏读, 不可重复读) 基本不使用
  @Transactional(isolation = Isolation.READ_COMMITTED):读取已提交数据(会出现不可重复读和幻读)
  @Transactional(isolation = Isolation.REPEATABLE_READ):可重复读(会出现幻读)
  @Transactional(isolation = Isolation.SERIALIZABLE):串行化

  MYSQL: 默认为REPEATABLE_READ级别
  SQLSERVER: 默认为READ_COMMITTED

脏读 : 一个事务读取到另一事务未提交的更新数据
不可重复读 : 在同一事务中, 多次读取同一数据返回的结果有所不同, 换句话说, 
后续读取可以读到另一事务已提交的更新数据. 相反, "可重复读"在同一事务中多次
读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据
幻读 : 一个事务读到另一个事务已提交的insert数据

 

@Transactional注解中常用参数说明

参数名称

功能描述

readOnly

该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)

rollbackFor

该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:

指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)

指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})

rollbackForClassName

该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:

指定单一异常类名称:@Transactional(rollbackForClassName="RuntimeException")

指定多个异常类名称:@Transactional(rollbackForClassName={"RuntimeException","Exception"})

noRollbackFor

该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:

指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)

指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})

noRollbackForClassName

该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:

指定单一异常类名称:@Transactional(noRollbackForClassName="RuntimeException")

指定多个异常类名称:

@Transactional(noRollbackForClassName={"RuntimeException","Exception"})

propagation

该属性用于设置事务的传播行为,具体取值可参考表6-7。

例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)

isolation

该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置

timeout

该属性用于设置事务的超时秒数,默认值为-1表示永不超时

 

 

注意的几点:


  1、@Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.

  2、用 spring 事务管理器,由spring来负责数据库的打开,提交,回滚.默认遇到运行期例外(throw new RuntimeException("注释");)会回滚,即遇到不受检查(unchecked)的例外时回滚;而遇到需要捕获的例外(throw new Exception("注释");)不会回滚,即遇到受检查的例外(就是非运行时抛出的异常,编译器会检查到的异常叫受检查例外或说受检查异常)时,需我们指定方式来让事务回滚要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) .如果让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
如下:

复制代码

1 @Transactional(rollbackFor=Exception.class) //指定回滚,遇到异常Exception时回滚
2 public void methodName() {
3    throw new Exception("注释");
4 }
5 @Transactional(noRollbackFor=Exception.class)//指定不回滚,遇到运行期例外(throw new RuntimeException("注释");)会回滚
6 public ItimDaoImpl getItemDaoImpl() {
7    throw new RuntimeException("注释");
8 }

复制代码

  3、@Transactional 注解应该只被应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。


  4、@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。然而,请注意仅仅 @Transactional 注解的出现不足于开启事务行为,它仅仅 是一种元数据,能够被可以识别 @Transactional 注解和上述的配置适当的具有事务行为的beans所使用。上面的例子中,其实正是 元素的出现 开启 了事务行为。


  5、Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。因为注解是不能继承的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装(将被确认为严重的)。因此,请接受Spring团队的建议并且在具体的类上使用 @Transactional 注解。

分类: Spring

好文要顶 关注我 收藏该文  

Just_Do
关注 - 4
粉丝 - 144

+加关注

15

0

« 上一篇:Spring 事务传播行为
» 下一篇:Spring 基于xml配置方式的事务

 posted on 2016-07-01 14:31 Just_Do 阅读(58272) 评论(7) 编辑 收藏

评论

#1楼    

 每天进步一丶   | 2017-03-28 09:24

非常棒,受教了,谢谢

支持(0)反对(0)

#2楼    

 双月当空照   | 2017-11-29 19:15

非常棒!!

支持(0)反对(0)

#3楼    

 lixinjia65   | 2018-01-18 15:53

棒棒的

支持(0)反对(0)

#4楼    

 紫薇郎   | 2018-03-06 10:38

@Transactional(noRollbackFor=Exception.class)//指定不回滚,遇到运行期例外(throw new RuntimeException("注释");)会回滚

写错了吧,应该是 遇到运行期例外(throw new RuntimeException("注释");)不会回滚吧

支持(0)反对(0)

#5楼    

 慵懒的肥鱼   | 2018-05-04 14:40

谢谢啦

支持(0)反对(0)

#6楼    

 周永发   | 2018-06-29 16:27

反正我是看不懂

支持(0)反对(0)

#7楼    

 哎,没辙   | 2018-07-13 15:41

谢谢

支持(0)反对(0)

刷新评论刷新页面返回顶部

注册用户登录后才能发表评论,请 登录 或 注册访问网站首页。

【推荐】超50万VC++源码: 大型组态工控、电力仿真CAD与GIS源码库!
【推荐】华为云11.11普惠季 血拼风暴 一促即发
【拼团】腾讯云服务器拼团活动又双叒叕来了!
【推荐】腾讯云新注册用户域名抢购1元起

腾讯云1008

最新IT新闻:
· Twitter CEO:社交媒体让用户观点极端化 得想法解决
· PHP 5版年底终止安全更新 6成网站恐面临风险
· 谷歌创始人投携手新西兰航空 欲推自动驾驶电动飞的
· 平安证券申请解除贾跃亭名下5758万股股票保全措施
· 富士康员工画像:app偏好多样化 喜欢“剁手”最爱却不是拼多多?
» 更多新闻...

 

最新知识库文章:

· 为什么说 Java 程序员必须掌握 Spring Boot ?
· 在学习中,有一个比掌握知识更重要的能力
· 如何招到一个靠谱的程序员
· 一个故事看懂“区块链”
· 被踢出去的用户

» 更多知识库文章...

公告

昵称:Just_Do
园龄:4年2个月
粉丝:144
关注:4

+加关注

<2018年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

搜索

 

 

常用链接

随笔分类

Android(3)

ASP.NET(4)

ASP.NET MVC(22)

ASP.NET WebApi(9)

autofac(3)

Azure

C#(30)

C# 基础知识(1)

CSS(4)

C语言(5)

DevExpress(1)

dos.orm(1)

Dotnetbar(1)

Echarts(2)

Entity Framework(19)

hibernate(19)

HTML+CSS(4)

IBatis.Net(10)

IIS配置(3)

Java(43)

Javascript(16)

JavaWeb(17)

Java资料(3)

JQuery和Ajax(6)

JSON.NET(1)

jsp基础(2)

JS插件(2)

Mybatis(16)

MySql(4)

NPOI(3)

Oracle(1)

Redis(1)

select2(1)

Spring(26)

springmvc(21)

Sql Server(6)

Sqlite(2)

struts2(13)

SuperSocket(4)

svg(2)

VS插件(2)

WebService(1)

安卓开发(4)

工具介绍

收藏网址(1)

手工制作(2)

微信开发(2)

系统(2)

下载(3)

随笔档案

2017年7月 (1)

2017年6月 (2)

2017年5月 (12)

2017年3月 (5)

2017年2月 (17)

2017年1月 (1)

2016年12月 (14)

2016年11月 (4)

2016年10月 (4)

2016年9月 (7)

2016年8月 (35)

2016年7月 (54)

2016年6月 (91)

2016年5月 (11)

2016年4月 (2)

2016年3月 (1)

2016年2月 (1)

2016年1月 (2)

2015年12月 (9)

2015年11月 (3)

2015年10月 (1)

2015年9月 (8)

2015年8月 (4)

2015年7月 (6)

2015年6月 (17)

2015年5月 (2)

2015年4月 (2)

2015年3月 (24)

2015年2月 (1)

2015年1月 (5)

2014年12月 (1)

2014年11月 (1)

java学习网站

svg

超级强大的SVG SMIL animation动画详解

最新评论

阅读排行榜

评论排行榜

推荐排行榜

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值