你可能想了解的 @Transactional

在业务的开发中难免会使用到事务。

事务的ACID

  • A(Atomicity) 原子性 :一个事务的最终状态只能是执行完成或未执行,不存在执行一半行为的情况。
  • C(Consistency) 一致性:事务在执行的前后,从一个状态变成另一个状态,总体的数据保持完整性。
  • I(Isolation) 隔离性:一个事务执行过程中对另一个事务没有影响,相互独立。并且一个事务在执行是看待另一个事务只能是执行完成或未执行的状态。
  • D(Durability) 持久性:一个事务在执行结束后数据的改变是永久的。

在Spring中使用了注解的形式对事务提供了良好的支持和方便的使用。下面是具体的介绍和使用方法。

源码切入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从源码可以看出:

  • 注解主要作用于类和方法 当类和方法都标注时,会优先按方法的配置。
  • 如果没有声明任何回滚异常,默认遇到RuntimeException触发回滚也就是遇到其他Exception时无法回滚。
  • 当你使用try catch捕捉异常后,异常将无法被回滚。

参数分析

value / transactionManager

用来标注事务管理器bean名称org.springframework.transaction.PlatformTransactionManager

propagation

配置事务的传播行为。具体有7种存在如下枚举类中:
在这里插入图片描述

类型说明适用场景
REQUIRED默认类型 当前如果存在事务就加入,若没有新建一个事务一般情况下
SUPPORTS当前如果存在事务就加入,不存在则以非事务形式运行适合事务可以有可无的情况
MANDATORY当前如果存在事务就加入,不存在则抛出异常适合必须要在前一个事务中执行的情况
REQUIRES_NEW新建事务,如果当前存在事务则把当前事务暂停(suspending)适合单独需要新建事务的情况
NOT_SUPPORTED非事务的形式运行,如果当前存在事务把当前事务暂停(suspending)适合不需要被事务影响的情况
NEVER以非事务的形式执行,如果当前存在事务则抛出异常)适合必须不在事务中运行,获取异常处理的情况
NESTED如果当前事务存在,则在嵌套事务内运行这个没怎么明白

Isolation

/**
	 * Use the default isolation level of the underlying datastore.
	 * All other levels correspond to the JDBC isolation levels.
	 * @see java.sql.Connection
	 */

事务的隔离级别 默认使用的是数据库底层隔离级别。 MySQL的innodb引擎默认支持的是 REPEATABLE-READ(可重复读)

  • Isolation.READ_UNCOMMITTED读取未提交数据(会出现脏读, 一个事务会读取到另一个事务未提交的数据)基本不使用

  • Isolation.READ_COMMITTED读取已提交数据(会出现不可重复读和幻读)

  • Isolation.REPEATABLE_READ可重复读(会出现幻读)

  • Isolation.SERIALIZABLE串行化 最高的级别,确保了事务之间不会产生错误,但性能相对较低。

timeout

事务的超时时间 默认也是使用数据库系统的内置超时时间,超过这个时间事务自动回滚。MySQL中默认超时时间为50s,可以自行设置。
在这里插入图片描述

readOnly

只读属性,默认为false。当设置为true时 事务为只读事务,相当于数据库是只读的。用于一个事务的多条查询之间保持数据的正确性,防止在事务操作的过程中,数据被另一个完成的事务修改导致了两次的不一致性。

在这里插入图片描述
如图所示 事务1 两次查询,如果要保持一致性,那么事务2的修改数据操作就不能发生。

rollbackFor

需要回滚的异常类型,默认为Java中受检查的异常。
包括RuntimeException 及其子类 和 Error 。
由于业务中常常直接抛出Exception 通常可设置成

@Transactional(rollbackFor = Exception.class)

也可以实现继承RuntimeException的自定义异常,然后

@Transactional(rollbackFor = MyRuntimeException.class)

rollbackForClassName

声明需要回滚的异常类名,String类型,可以不定义也可以定义一个数组

noRollbackFor noRollbackForClassName

不需要回滚的异常类和类名,和上述两个参数使用方法不尽相同。

使用方法

直接在Service层的方法或者类上注释即可。Spring会采用AOP的形式进行事务的实现。

总结

通过这次学习,我们知道了@Transactional注解为我们带来了很多方便,可以对事务进行简单的处理。但是也需要注意可能带来的风险,比如回滚失败的多种情况,可能没有声明回滚类,或者事务传播行为的错误设定。对各个参数的含义都要有深刻的理解,例如各个隔离级别可能造成的错误和性能的影响等。

每一次的学习总结,都是一次进步!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
@Transactional注解是Spring框架中用于声明式事务管理的一种配置方式。该注解可以帮助我们简化事务的开启、提交或回滚操作,并通过aop的方式对事务进行管理。在面试中,通常会被问到关于数据库事务的问题。而对于@Transactional注解,很多人可能只是简单地知道它可以用于事务管理,而不清楚具体的用法和作用。因此,在面试中,面试官经常会提问关于@Transactional注解的相关问题,以考察候选人对于事务管理的理解和实践经验。因此,对于要在面试中表现出色的候选人来说,了解@Transactional注解的使用方法和原理是非常重要的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Spring的@Transactional如何实现的(必考)](https://blog.csdn.net/qq_42914528/article/details/117719038)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [mybatis统计每条SQL的执行时间的方法示例](https://download.csdn.net/download/weixin_38685793/14907145)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值