解释@Transactional注解的用法
@Transactional可以说是spring中最常用的注解之一了,通常情况下我们在需要对一个service方法添加事务时,加上这个注解,如果发生unchecked exception,就会发生rollback,最典型的例子如下。
@Service
public class StudentService {@AutowiredStudentDao studentDao;@Transactionalpublic void innerSave(int i) {Student student = new Student();student.setName("test" + i);studentDao.save(student);//i=5 会出现异常int a = 1 / (i - 5);}
}
在调用innerSave(5)时会发运算异常,导致保存操作回滚,不在此赘述了。
新的需求:循环保存10个学生,发生异常时要求回滚。
我们理所当然的写出了下面的代码,在StudentService.java添加如下方法
public void outerLooper1() {for (int i = 1; i <= 10; i++) {try{innerSave(i);}catch (Exception e){e.printStackTrace();}}}
先考虑一下test5这个学生有没有保存呢?
结果:
依然出现了,考虑下问题出在哪儿了?
其实也好理解,spring中@Transactional 的事务开启 ,是基于接口 或者是类的代理被创建的。所以在同一个类中一个普通方法outerLooper1()调用另一个有事务的方法innerSave(),事务是不会起作用的。要解决这个问题,一般我的做法是写一个帮助类,注入到当前类中,来完成事务操作。
@Autowired
UtilService utilService;public void outerLooper2() {for (int i = 1; i <= 10; i++) {utilService.innerSave(i);}
}
在spring中使用事务需要遵守一些规范和了解一些坑点,别想当然。列举一下一些注意点。
在需要事务管理的地方加@Transactional 注解。@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的public 方法上。
@Transactional 注解只能应用到 public 可见度的方法上。如果你在 protected、private 或者package-visible 的方法上使用@Transactional 注解,它也不会报错,但是这个被注解的方法将不会展示已配置的事务设置。
Spring团队建议在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。在接口上使用@Transactional 注解,只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承的,这就意味着如果正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装。
@Transactional 的事务开启 ,或者是基于接口的或者是基于类的代理被创建。所以在同一个类中一个方法调用另一个方法有事务的方法,事务是不会起作用的。
了解事务的隔离级别,
各个数据库默认的隔离级别是不一样的,
在spring中用的是isolation = Isolation.READ_COMMITTED来设置;
了解事务的传播机制,
当发生事务嵌套时,按照业务选择对应的传播机制,用propagation = Propagation.REQUIRED来设置。
原文:https://blog.csdn.net/u013815546/article/details/55101708
解释@Transactional注解的用法相关推荐
- spring的@Transactional注解详细用法
概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性. Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型 ...
- SpringCloud学习笔记009---杂七杂八003:spring的@Transactional注解详细用法
概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性. Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型 ...
- TransactionTemplate和@Transactional注解的区别
spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.对于编程式事务 ...
- @Transactional注解详细使用
目录 一.@Transactional 注解使用注意事项 二.Spring事务的传播规则 三.微服务开发案例 四.Spring 事务源码深度解析 一.@Transactional 注解使用注意事项 @ ...
- @Transactional注解用法
1. 事务隔离级别 隔离级别是指若干个并发的事务之间的隔离程度.TransactionDefinition 接口中定义了五个表示隔离级别的常量: TransactionDefinition.ISOLA ...
- @aspect注解类不生效_springboot:@Transactional注解 VS @Service注解
1. Transactional注解与Service/Component注解冲突? 之前遇到一个神奇的事情--用Transactional注解的方法,数据处理了一半,后面的数据处理抛出异常后,没有回滚 ...
- 一口气说出 6 种 @Transactional 注解的失效场景
一.事务 事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,主要分为编程式事务和声明式事务两种. 编程式事务:是指在代码中手动的管理事务的提交.回滚等操作,代码侵入性比较强, ...
- @Transactional注解在什么情况下失效?
引言 1.@Transactional 注解相信大家并不陌生,平时开发中很常用的一个注解,它能保证方法内多个数据库操作要么同时成功.要么同时失败. 2.使用@Transactional注解时需要注意许 ...
- @getmapping注解的作用_一口气说出6种,@Transactional注解的失效场景
作者:程序员内点事 引言 昨天公众号粉丝咨询了一个问题,说自己之前面试被问@Transactional注解哪些场景下会失效,一时语塞致使面试失败.所以今天简单的和大家分享一下@Transactiona ...
最新文章
- docker klee tutorial_通过Docker使用KLEE
- ajax更改dom,javascript – 用Ajax响应替换DOM节点
- R:matlab交互,数据调用
- 机器学习的书看不懂怎么办?看看大神怎么回答?
- maven 部分命令
- leetcode 1239. 串联字符串的最大长度
- 北大提出Gate Decorator,利用LSTM思想来做CNN剪枝
- 【NLP】毕设学习笔记(八)“前馈 + 反馈” = 循环神经网络RNN
- Flutter进阶—布局一个控件
- activiti 文档_Activiti快速入门 kft-activiti-demo
- 咪咕:笔试题(20190916)
- 英特尔cpu发布时间表_英特尔公司宣布第九代桌面CPU发售时间:i9 9900K将于10月19日正式发售!...
- win10安装opcenum_如何完美的解决win10安装时遇到的问题?
- 链家租房市场分析(R爬虫、数据可视化)
- 怎么有python画五角星_Python的画五角星
- java对pdf分割_PDFBox分割PDF文档
- 本人新书上市 《分布式系统与一致性》
- 单片机实验汇编2--P1口输入、输出实验
- 支付宝在线支付接口申请教程
- 10 Java基础 多线程2
热门文章
- kerberos简介
- HttpClient模块的HttpGet和HttpPost及Connection to refuse解决
- pdo_dblib.dll for php7,php_pdo_dblib.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...
- 2020年度中国“最佳女性投资人”榜单发布
- linux重装出现cannot load file 5555h,技术员教你解决win7系统重装开机提示cannot load file code:5555h的操作方案...
- 【解决】Splunk Lookup table owner: nobody
- osTicket中文,osTicket汉化
- TypeError: expected Tensor as element 0 in argument 0, but got numpy.ndarray
- 无线wifi打印机服务器原理,一般无线打印机的连接方法及遇到常见故障解决办法...
- Android 打包解析软件包时出现问题