@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注解的用法相关推荐

  1. spring的@Transactional注解详细用法

    概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性. Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型 ...

  2. SpringCloud学习笔记009---杂七杂八003:spring的@Transactional注解详细用法

    概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性. Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型 ...

  3. TransactionTemplate和@Transactional注解的区别

    spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.对于编程式事务 ...

  4. @Transactional注解详细使用

    目录 一.@Transactional 注解使用注意事项 二.Spring事务的传播规则 三.微服务开发案例 四.Spring 事务源码深度解析 一.@Transactional 注解使用注意事项 @ ...

  5. @Transactional注解用法

    1. 事务隔离级别 隔离级别是指若干个并发的事务之间的隔离程度.TransactionDefinition 接口中定义了五个表示隔离级别的常量: TransactionDefinition.ISOLA ...

  6. @aspect注解类不生效_springboot:@Transactional注解 VS @Service注解

    1. Transactional注解与Service/Component注解冲突? 之前遇到一个神奇的事情--用Transactional注解的方法,数据处理了一半,后面的数据处理抛出异常后,没有回滚 ...

  7. 一口气说出 6 种 @Transactional 注解的失效场景

    一.事务 事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,主要分为编程式事务和声明式事务两种. 编程式事务:是指在代码中手动的管理事务的提交.回滚等操作,代码侵入性比较强, ...

  8. @Transactional注解在什么情况下失效?

    引言 1.@Transactional 注解相信大家并不陌生,平时开发中很常用的一个注解,它能保证方法内多个数据库操作要么同时成功.要么同时失败. 2.使用@Transactional注解时需要注意许 ...

  9. @getmapping注解的作用_一口气说出6种,@Transactional注解的失效场景

    作者:程序员内点事 引言 昨天公众号粉丝咨询了一个问题,说自己之前面试被问@Transactional注解哪些场景下会失效,一时语塞致使面试失败.所以今天简单的和大家分享一下@Transactiona ...

最新文章

  1. docker klee tutorial_通过Docker使用KLEE
  2. ajax更改dom,javascript – 用Ajax响应替换DOM节点
  3. R:matlab交互,数据调用
  4. 机器学习的书看不懂怎么办?看看大神怎么回答?
  5. maven 部分命令
  6. leetcode 1239. 串联字符串的最大长度
  7. 北大提出Gate Decorator,利用LSTM思想来做CNN剪枝
  8. 【NLP】毕设学习笔记(八)“前馈 + 反馈” = 循环神经网络RNN
  9. Flutter进阶—布局一个控件
  10. activiti 文档_Activiti快速入门 kft-activiti-demo
  11. 咪咕:笔试题(20190916)
  12. 英特尔cpu发布时间表_英特尔公司宣布第九代桌面CPU发售时间:i9 9900K将于10月19日正式发售!...
  13. win10安装opcenum_如何完美的解决win10安装时遇到的问题?
  14. 链家租房市场分析(R爬虫、数据可视化)
  15. 怎么有python画五角星_Python的画五角星
  16. java对pdf分割_PDFBox分割PDF文档
  17. 本人新书上市 《分布式系统与一致性》
  18. 单片机实验汇编2--P1口输入、输出实验
  19. 支付宝在线支付接口申请教程
  20. 10 Java基础 多线程2

热门文章

  1. kerberos简介
  2. HttpClient模块的HttpGet和HttpPost及Connection to refuse解决
  3. pdo_dblib.dll for php7,php_pdo_dblib.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...
  4. 2020年度中国“最佳女性投资人”榜单发布
  5. linux重装出现cannot load file 5555h,技术员教你解决win7系统重装开机提示cannot load file code:5555h的操作方案...
  6. 【解决】Splunk Lookup table owner: nobody
  7. osTicket中文,osTicket汉化
  8. TypeError: expected Tensor as element 0 in argument 0, but got numpy.ndarray
  9. 无线wifi打印机服务器原理,一般无线打印机的连接方法及遇到常见故障解决办法...
  10. Android 打包解析软件包时出现问题