转自:https://www.cnblogs.com/kesimin/p/9546225.html

@Transactional

spring 事务注解

1.简单开启事务管理

@EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />

2.事务注解详解

默认遇到throw new RuntimeException(“…”);会回滚 
需要捕获的throw new Exception(“…”);不会回滚

  • 指定回滚
@Transactional(rollbackFor=Exception.class) public void methodName() {// 不会回滚 throw new Exception("..."); } 
  • 指定不回滚
@Transactional(noRollbackFor=Exception.class)public ItimDaoImpl getItemDaoImpl() {// 会回滚throw new RuntimeException("注释"); } 
  • 如果有事务,那么加入事务,没有的话新建一个(不写的情况下)
    @Transactional(propagation=Propagation.REQUIRED)
  • 容器不为这个方法开启事务
@Transactional(propagation=Propagation.NOT_SUPPORTED)
  • 不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.REQUIRES_NEW) 
  • 必须在一个已有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.MANDATORY)
  • 必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
 @Transactional(propagation=Propagation.NEVER) 
  • 如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
    @Transactional(propagation=Propagation.SUPPORTS) /*public void methodName(){// 本类的修改方法 1update();// 调用其他类的修改方法otherBean.update();// 本类的修改方法 2 update(); } other失败了不会影响 本类的修改提交成功 本类update的失败,other也失败 */ 

@Transactional(propagation=Propagation.NESTED)

  • readOnly=true只读,不能更新,删除
@Transactional (propagation = Propagation.REQUIRED,readOnly=true) 
  • 设置超时时间
@Transactional (propagation = Propagation.REQUIRED,timeout=30)
  • 设置数据库隔离级别
@Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT)

3.指定事务管理器

spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可。

关于事务管理器,不管是JPA还是JDBC等都实现自接口 PlatformTransactionManager 如果你添加的是 spring-boot-starter-jdbc 依赖,框架会默认注入 DataSourceTransactionManager 实例。如果你添加的是 spring-boot-starter-data-jpa 依赖,框架会默认注入 JpaTransactionManager 实例。

你可以在启动类中添加如下方法,Debug测试,就能知道自动注入的是 PlatformTransactionManager 接口的哪个实现类。

3.1 打印项目事务管理器

@EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />
@SpringBootApplication
public class ProfiledemoApplication { @Bean public Object testBean(PlatformTransactionManager platformTransactionManager){ System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName()); return new Object(); } public static void main(String[] args) { SpringApplication.run(ProfiledemoApplication.class, args); } } 

这些SpringBoot为我们自动做了,这些对我们并不透明,如果你项目做的比较大,添加的持久化依赖比较多,我们还是会选择人为的指定使用哪个事务管理器。 
代码如下:

3.2 指定事务管理器

@EnableTransactionManagement
@SpringBootApplication
public class ProfiledemoApplication { // 其中 dataSource 框架会自动为我们注入 @Bean public PlatformTransactionManager txManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean public Object testBean(PlatformTransactionManager platformTransactionManager) { System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName()); return new Object(); } public static void main(String[] args) { SpringApplication.run(ProfiledemoApplication.class, args); } } 

在Spring容器中,我们手工注解@Bean 将被优先加载,框架不会重新实例化其他的 PlatformTransactionManager 实现类。

然后在Service中,被 @Transactional 注解的方法,将支持事务。如果注解在类上,则整个类的所有方法都默认支持事务。

对于同一个工程中存在多个事务管理器要怎么处理,请看下面的实例,具体说明请看代码中的注释。

3.1 使用指定的事务管理器

@EnableTransactionManagement // 开启注解事务管理,等同于xml配置文件中的 <tx:annotation-driven />
@SpringBootApplication
public class ProfiledemoApplication implements TransactionManagementConfigurer { @Resource(name="txManager2") private PlatformTransactionManager txManager2; // 创建事务管理器1 @Bean(name = "txManager1") public PlatformTransactionManager txManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } // 创建事务管理器2 @Bean(name = "txManager2") public PlatformTransactionManager txManager2(EntityManagerFactory factory) { return new JpaTransactionManager(factory); } // 实现接口 TransactionManagementConfigurer 方法,其返回值代表在拥有多个事务管理器的情况下默认使用的事务管理器 @Override public PlatformTransactionManager annotationDrivenTransactionManager() { return txManager2; } public static void main(String[] args) { SpringApplication.run(ProfiledemoApplication.class, args); } } @Component public class DevSendMessage implements SendMessage { // 使用value具体指定使用哪个事务管理器 @Transactional(value="txManager1") @Override public void send() { System.out.println(">>>>>>>>Dev Send()<<<<<<<<"); send2(); } // 在存在多个事务管理器的情况下,如果使用value具体指定 // 则默认使用方法 annotationDrivenTransactionManager() 返回的事务管理器 @Transactional public void send2() { System.out.println(">>>>>>>>Dev Send2()<<<<<<<<"); } }

转载于:https://www.cnblogs.com/sharpest/p/8004247.html

26.SpringBoot事务注解详解相关推荐

  1. springboot常用注解详解

    在springboot中,经常会用到一些注解,它们各自代表着什么呢?在这个属于我们的节日里,快来了解一下吧! 1.@SpringBootApplication 一般不会主动去使用它,但是要知道它是一个 ...

  2. @Transactional 事务注解详解

    本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...

  3. SpringBoot - @JsonFormat注解详解

    写在前面 @JsonFormat注解是一个时间格式化注解,用于格式化时间. 比如存储在MYSQL中的数据是dateTime类型,将数据获取以后封装到实体类中的时候,就会变成英文的时间格式(Wed Ju ...

  4. Java | SpringBoot 常用注解详解

    1 概述 IOC 是Spring 最为重要的功能之一,就是将Bean初始化加载到容器中,Bean是如何加载到容器的,可以使用Spring注解方式或者Spring XML配置方式. 简言之,注解本身没有 ...

  5. SpringBoot - @InitBinder注解详解

    写在前面 @InitBinder注解可以作用在被@Controller注解的类的方法上,表示为当前控制器注册一个属性编辑器,用于对WebDataBinder进行初始化,且只对当前的Controller ...

  6. SpringBoot - @PreAuthorize注解详解

    写在前面 @PreAuthorize注解会在方法执行前进行权限验证,支持Spring EL表达式,它是基于方法注解的权限解决方案.只有当@EnableGlobalMethodSecurity(preP ...

  7. spring-boot注解详解(一)

    spring-boot注解详解(一) @SpringBootApplication @SpringBootApplication = (默认属性)@Configuration + @EnableAut ...

  8. 【SpringBoot 】SpringBoot注解详解

    [SpringBoot ]SpringBoot注解详解 一.注解(annotations)列表  @SpringBootApplication:包含了@ComponentScan.@Configura ...

  9. SpringBoot定时任务@Scheduled注解详解

    SpringBoot定时任务@Scheduled注解详解 项目开发中,经常会遇到定时任务的场景,Spring提供了@Scheduled注解,方便进行定时任务的开发 概述 要使用@Scheduled注解 ...

最新文章

  1. Docker的原理及特性介绍
  2. request.getRemoteAddr()和request.getRemoteHost()
  3. Linux下快速安装TensorFlow的教程
  4. 不能用 + 拼接字符串? 这次我要吊打面试官!
  5. java backbone_[Java教程]移动前端开发中的Backbone之一:Backbone中的模型和集合
  6. mysql的纵向扩展方案_SQL Server横向扩展方案-SODA
  7. 台式机也颤抖!ROG Strix S5AS性能强悍到底
  8. java自动生成函数注释_IDEA类和方法注释自动生成(2019-08-31 21:47写)
  9. JS判断是否在微信浏览器打开
  10. 简单理解JavaScript中的闭包
  11. html canvas drawrect 变形,canvas图形变换
  12. Python的web小游戏启动心得
  13. java中的StringUtil.isEmpty和StringUtil.isBlank
  14. html 简单动画效果,HTML-简单动画
  15. linux小红帽网卡设定,LINUX红帽子怎么配置上网
  16. ICE C++ Hello World
  17. EXPLOITING CVE-2016-2060 ON QUALCOMM DEVICES
  18. 抑郁症可以学计算机吗,AI能从人的话语中察觉到抑郁症吗?目前还为时过早
  19. 5v供电的数字功放芯片有哪些
  20. Latex里一些特殊的数学符号

热门文章

  1. java中定义类的关键字为_在Java中,定义类的关键字是__________________.
  2. python3装饰器详解_Python装饰器详解
  3. 控制信号(单脉冲信号)的跨时钟域传输问题
  4. 为什么在用Vivado生成存储器配置文件时找不到相应型号的Flash芯片呢?
  5. 【 FPGA 】跨时钟域处理以及边沿检测
  6. 【 FPGA 】7 Series FPGA中对SRL的设计指导
  7. python 中if __name__ = '__main__' 的作用
  8. 首款VR全身触控体验套件Teslasuit,让你浑身“来电”
  9. hive无法执行带where语句的SQL
  10. 实用 | 从Apache Kafka到Apache Spark安全读取数据