SpringBoot - @Transactional注解详解

这篇具有很好参考价值的文章主要介绍了SpringBoot - @Transactional注解详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

Spring中的@Transactional注解,基于动态代理的机制,提供了一种透明的事务管理机制,方便快捷的解决在开发中碰到的问题,@Transactional 的事务开启 ,或者是基于接口的或者是基于类的代理被创建。Spring为了更好的支撑数据库操作,在框架中支持了两种事务管理的方式:编程式事务和声明式事务,能够保证作单个逻辑工作单元执行的一系列操作,要么同时成功,要么同时失败。

如何使用

(1)可以作用在类和方法上。
(2)建议不要作用在接口或接口的方法上,因为只有使用基于接口的代理时注解才有效。建议作用在实现类的方法上。
(3)当作用在类上时,该类的PUBLIC方法都具有该类型是事务属性,但是使用作用在方法上的注解来覆盖类级别的定义。
(4)方法的访问权限为PUBLIC。
(5)@Transactional(rollbackFor=Exception.class),如果方法上加了这个注解,那么当这个方法抛出异常时(运行时和非运行时)就会回滚,数据库里面的数据也会回滚。如果不配置rollbackFor属性,那么事物只会在遇到运行时异常才会回滚。
(6)默认情况下,SPRING只有在抛出的异常为运行时且为unchecked 异常才会回滚事务,也就是抛出的异常为RuntimeException 的子类(Errors也会)时才会回滚事务,而抛出 checked 异常则不会回滚事务 ,当然可以通过 @Transactional rollbackFor进行配置。

(6.1)checked异常: 一般是指程序不能直接控制的外界情况,是指在编译的时候就需要检查的一类异常,用户程序中必须采用try-catch机制处理或者通过throws交由调用者来处理。这类异常主要是指除了Error以及RuntimeException及其子类之外的异常。
(6.2)unchecked异常:一般是那些不在编译的时就要处理的一类异常。在JAVA体系里,所有的Error以及RuntimeException及其子类都是unchecked异常。
SpringBoot - @Transactional注解详解

1. 源码定义
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {

	// 可选的限定描述符,指定使用的事务管理器
	@AliasFor("transactionManager")
	String value() default "";

	@AliasFor("value")
	String transactionManager() default "";

	String[] label() default {};

	// 可选的事务传播机制
	Propagation propagation() default Propagation.REQUIRED;

	// 可选的事务隔离级别
	Isolation isolation() default Isolation.DEFAULT;

	// 事务超时时间设置
	int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;

	String timeoutString() default "";

	boolean readOnly() default false;

	// 导致事务回滚的异常类
	Class<? extends Throwable>[] rollbackFor() default {};

    // 导致事务回滚的异常类名称
	String[] rollbackForClassName() default {};
	
	// 不会导致事务回滚的异常类
	Class<? extends Throwable>[] noRollbackFor() default {};

    // 不会导致事务回滚的异常类名称
	String[] noRollbackForClassName() default {};

}
2. 传播机制
序号 机制名称 描述
1 REQUIRED 默认值,如果当前存在事务,则加入该事务,如果当前没有事务,则创建一个新的事务。
2 REQUIRES_NEW 首先创建一个新的事务,如果当前存在事务,则把当前事务挂起。
3 SUPPORTS 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
4 NOT_SUPPORTED 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
5 NEVER 以非事务方式运行,如果当前存在事务,则抛出异常。
6 MANDATORY 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
7 NESTED 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行; 如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。
3. 隔离级别
序号 名称 描述
1 DEFAULT 使用后端数据库默认的隔离级别
2 READ_UNCOMMITTED 读取未提交数据(会出现脏读, 不可重复读)
3 READ_COMMITTED 读取已提交数据(会出现不可重复读和幻读)
4 REPEATABLE_READ 可重复读(会出现幻读)
5 SERIALIZABLE 串行化

使用场景

1. 同一个类
场景1

同一类中有A和B两个方法,A方法上没有@Transactional注解,B方法上有,上层应用通过A方法间接调用B方法,B方法抛出异常,此时A方法和B方法操作都不会回滚。


public void a() {
	b();
}
@Transactional(rollbackFor = Exception.class)
public void b() {
}
场景2

同一类中有A和B两个方法,A方法上有@Transactional注解,B方法上没有,上层应用通过A方法间接调用B方法,B方法抛出异常,此时A方法和B方法操作全部回滚。

@Transactional(rollbackFor = Exception.class)
public void a() {
	b();
}
public void b() {
}
场景3

同一类中有A和B两个方法,A方法和B方法上都有@Transactional注解,上层应用通过A方法间接调用B方法,B方法抛出异常,此时A方法和B方法操作全部回滚。

@Transactional(rollbackFor = Exception.class)
public void a() {
	b();
}
@Transactional(rollbackFor = Exception.class)
public void b() {
}
2. 不同的类
场景1

类1中有A方法,类2中有B方法,A方法上有@Transactional注解,B方法上没有,上层应用通过A方法间接调用B方法,B方法抛出异常,此时A方法和B方法操作全部回滚。

@Transactional(rollbackFor = Exception.class)
public void a() {
	b();
}
public void b() {
}
场景2

类1中有A方法,类2中有B方法,A方法和B方法上都有@Transactional注解,上层应用通过A方法间接调用B方法,B方法抛出异常,此时A方法和B方法操作全部回滚。

@Transactional(rollbackFor = Exception.class)
public void a() {
	b();
}
@Transactional(rollbackFor = Exception.class)
public void b() {
}
场景3

类1中有A方法,类2中有B方法,A方法和B方法上都有@Transactional注解,上层应用通过A方法间接调用B方法,B方法抛出异常,但是A方法捕获了异常,此时B方法操作回滚,A方法抛出异常。

@Transactional(rollbackFor = Exception.class)
public void a() {
	try {
	    b();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
@Transactional(rollbackFor = Exception.class)
public void b() {
}
场景4

类1中有A方法,类2中有B方法,A方法和B方法上都有@Transactional注解,上层应用通过A方法间接调用B方法,B方法抛出异常,但是A方法捕获了异常,此时B方法操作回滚,A方法操作成功。文章来源地址https://www.toymoban.com/news/detail-491774.html

@Transactional(rollbackFor = Exception.class)
public void a() {
	try {
	    b();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public void b() {
}

到了这里,关于SpringBoot - @Transactional注解详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring @Transactional注解事务传播机制propagation参数说明

    在SpringBoot项目中,我们通常使用 @Transactional 去进行事务控制,而 @Transactional 注解中,有个比较关键的属性就是 propagation 。在一个 多事务 的环境中,一个事务方法调用另一个事务方法时,就会涉及到事务的传播行为,该属性用来控制一段代码经过多个 @Transactional 注解生效(

    2024年02月11日
    浏览(43)
  • Spring 声明式事务讲解,和 @Transactional注解的用法

    目录 一、Spring框架介绍 二、什么是声明式事务 三、如何解决并发性事务问题 四、@Transactional注解的用法 Spring框架是一个开源的Java应用程序开发框架,旨在简化企业级Java应用程序的开发。它提供了一种轻量级的、全面的编程和配置模型,可以帮助开发人员构建可扩展、模块

    2024年01月25日
    浏览(52)
  • Spring @Transactional事务传播机制详解

    我们日常工作中极少使用事务传播级别,单纯只是使用事务和rollbackfor抛出异常来解决事务问题,但其实我们很多时候使用的是不正确的,或者说会造成事务粒度过大,本文详解一下事务传播级别,也让自己更好地处理事务问题。 1.什么是事务传播机制? 举个栗子,方法A是一

    2024年02月14日
    浏览(43)
  • Spring5学习随笔-事务属性详解(@Transactional)

    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】 事务是 保证业务操作完整性的一种数据库机制 事务的4特点:ACID A 原子性 C 一致性 I 隔离性 D 持久性 JDBC: Connection.setAutoCommit(false) Connect

    2024年02月05日
    浏览(40)
  • Spring使用@Transactional 管理事务,Java事务详解。

    B站视频:https://www.bilibili.com/video/BV1eV411u7cg 技术文档:https://d9bp4nr5ye.feishu.cn/wiki/HX50wdHFyiFoLrkfEAAcTBdinvh 简单来说事务就是一组对数据库的操作 要么都成功,要么都失败。 事务要保证可靠性,必须具备四个特性:ACID。 A:原子性:事务是一个原子操作单元,要么完全执行,要么

    2024年02月11日
    浏览(31)
  • Spring 声明式事务 @Transactional(详解)【面试重点,小林出品】

            关于 @Transactional 注解的基本使用,推荐看Spring 声明式事务 @Transactional(基本使用)         本篇博客主要学习 @Transactional 注解当中的三个常⻅属性:         1. rollbackFor:异常回滚属性.指定能够触发事务回滚的异常类型.可以指定多个异常类型         2. Iso

    2024年01月25日
    浏览(49)
  • @Transactional注解

    目录 @Transactional注解可以作用于接口、接口方法、类以及类方法上 @Transactional注解的可用参数(@Transactional(写在 这里面)) 事物传播行为介绍: isolation  我们一般使用@Transactional注解都是用在类的方法上。官网也不建议使用在接口类上面,注解肯定都是用到了aop的思想,即

    2024年02月02日
    浏览(31)
  • 使用注解新开事务 @Transactional

    使用注解新开事务

    2024年02月07日
    浏览(36)
  • IDEA项目实践——Spring框架简介,以及IOC注解

    IDEA创建项目的操作步骤以及在虚拟机里面创建Scala的项目简单介绍 IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介 IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——动态SQL、关系映射、注解开发 文章目录 第1章 Spring 概述

    2024年02月14日
    浏览(48)
  • @Transactional注解作用,不生效的场景,事务回滚

    声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。 简而言之,@Transactional注解在代码执行出错的时候能够进行事务的回滚。 在启动类上添加@EnableTransac

    2024年02月10日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包