一文玩转@Transactional SpringAOP声明式事务

1.使用详解

`@Transactional` 注解是Spring框架中用于声明式事务管理的核心注解之一。通过在方法或类上添加 `@Transactional` 注解,你可以告诉Spring在调用该方法时启用事务管理。以下是 `@Transactional` 注解的使用方法及参数详解:

1. 在方法上使用:


   @Transactional
   public void someTransactionalMethod() {
       // 这个方法的执行将在一个事务中
       // 任何数据库操作都会在这个方法执行的同一个事务中
   }

2. 在类上使用:


   @Service
   @Transactional
   public class SomeTransactionalService {
       // 在这个类中所有的方法调用都将在事务中执行
   }
  

3. 参数:

   - readOnly:指定事务是否为只读。如果设置为 `true`,表示该事务只读取数据,不会对数据进行修改。默认值为 `false`。


     @Transactional(readOnly = true)
     public void readOnlyMethod() {
         // 仅读取数据的操作
     }

   - timeout:指定事务的超时时间,单位为秒。如果在指定时间内事务没有完成,将会被回滚。默认值为 `TransactionDefinition.TIMEOUT_DEFAULT`,表示使用默认的超时时间。


     @Transactional(timeout = 60) // 60秒超时
     public void methodWithTimeout() {
         // 可能会耗时很长的操作
     }
 

   - rollbackFor和 noRollbackFor:指定在哪些异常发生时事务应该回滚或不回滚。


     @Transactional(rollbackFor = {SQLException.class, IOException.class})
     public void methodThatMayThrowExceptions() throws SQLException, IOException {
         // 可能会抛出SQLException或IOException的操作
     }

   - propagation:指定事务的传播行为。例如,是否要在当前事务内加入已存在的事务,或者要开启一个新的事务。


     @Transactional(propagation = Propagation.REQUIRED)
     public void methodWithPropagation() {
         // 这个方法将会在一个事务中执行,如果当前没有事务,则会开启一个新的事务
     }

   这些是最常用的 `@Transactional` 注解的参数。通过合理配置这些参数,你可以灵活地管理你的事务行为。

2.修改事务的隔离级别

在Spring中,默认的事务隔离级别是数据库的默认级别。通常情况下,大多数数据库的默认事务隔离级别是**读已提交(Read Committed)**。

事务隔离级别决定了一个事务对于其他事务的可见性以及对其他事务的影响。不同的隔离级别会对并发访问数据库时出现的问题产生不同的影响。

在Spring中,你可以通过设置 `@Transactional` 注解的 `isolation` 属性来指定事务的隔离级别,例如:


@Transactional(isolation = Isolation.READ_UNCOMMITTED)
public void someTransactionalMethod() {
    // 这个方法的事务隔离级别为读未提交
}

`Isolation` 是一个枚举类型,包含了不同的隔离级别选项,例如 `READ_UNCOMMITTED`、`READ_COMMITTED`、`REPEATABLE_READ` 和 `SERIALIZABLE` 等。通过显式地设置 `isolation` 属性,你可以覆盖默认的隔离级别。

但需要注意的是,如果你没有显式地指定事务的隔离级别,Spring 将使用底层数据库的默认隔离级别作为默认值。

3.底层实现

`@Transactional` 注解是Spring框架中用于声明式事务管理的核心注解之一。它的实现主要依赖于Spring的事务管理器和AOP(面向切面编程)机制。

以下是对 `@Transactional` 注解在Java源码中的简要解析:

1. 源码位置:

   `@Transactional` 注解的源码位于 Spring Framework 项目中的 `org.springframework.transaction.annotation` 包下。

2. 注解定义:

   `@Transactional` 注解是一个元注解,它的定义如下:


   @Target({ElementType.METHOD, ElementType.TYPE})
   @Retention(RetentionPolicy.RUNTIME)
   @Documented
   public @interface Transactional {
       // 属性定义,例如 isolation、propagation、timeout、readOnly 等
   }

3. 属性:

   `@Transactional` 注解支持多个属性,用于配置事务的行为。一些常用的属性包括:

   - `isolation`:指定事务的隔离级别。
   - `propagation`:指定事务的传播行为。
   - `timeout`:指定事务的超时时间。
   - `readOnly`:指定事务是否为只读事务。
   - `rollbackFor` 和 `noRollbackFor`:指定在哪些异常发生时事务应该回滚或不回滚。

4. AOP代理:

   Spring使用AOP机制来实现 `@Transactional` 注解。在运行时,Spring会在方法执行前后织入事务管理相关的代码,以确保方法在事务的上下文中执行。

   这意味着 `@Transactional` 注解可以将事务管理从业务逻辑代码中分离出来,使得代码更加清晰和模块化。

5. 事务管理器:

   `@Transactional` 注解的实现依赖于Spring的事务管理器。在使用 `@Transactional` 注解时,你需要在Spring的配置文件中配置事务管理器,以便让Spring知道如何管理事务。

   Spring支持多种事务管理器,包括基于JDBC的事务管理器、基于JTA的事务管理器、以及基于Hibernate等ORM框架的事务管理器。

6. 源码实现:

   `@Transactional` 注解的具体实现比较复杂,涉及到Spring的AOP、事务拦截器、事务管理器等多个模块。它主要通过AOP机制来拦截带有 `@Transactional` 注解的方法调用,并在方法执行前后启动和提交事务。

总的来说,`@Transactional` 注解是Spring框架中用于声明式事务管理的重要工具,它使得在Spring应用中使用事务变得简单和便捷。

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guicai_guojia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值