06-@Transactional底层原理
...大约 3 分钟Java
@Transactional
是 Spring 框架中用于声明事务的注解。它的主要功能是在方法或类上声明一个事务边界,使得该方法或类中的操作要么全部成功,要么全部失败,保持数据的一致性和完整性。@Transactional
的底层原理可以分为以下几个方面来理解:
1. AOP(面向切面编程)
Spring 使用 AOP 来实现 @Transactional
。在应用程序启动时,Spring 会扫描所有带有 @Transactional
注解的类或方法,并创建相应的代理对象。当这些方法被调用时,代理对象会拦截调用,并在调用前后添加事务管理的逻辑。
2. 代理模式
Spring 可以通过 JDK 动态代理或者 CGLIB 代理来创建这些代理对象:
- JDK 动态代理:适用于实现了接口的类。Spring 会为这些类创建一个实现相同接口的代理类,并在代理类中实现事务管理的逻辑。
- CGLIB 代理:适用于没有实现接口的类。CGLIB 会动态生成目标类的子类,并在子类中实现事务管理的逻辑。
3. 事务管理器
Spring 提供了多种事务管理器,比如 DataSourceTransactionManager
、JpaTransactionManager
等,它们负责具体的事务管理工作。@Transactional
注解通过这些事务管理器来启动、提交和回滚事务。
4. 事务边界的控制
当一个带有 @Transactional
注解的方法被调用时,事务管理器会:
- 开始事务:在方法执行前,事务管理器会检查当前是否已经有一个事务存在。如果没有,它会开启一个新的事务。
- 事务挂起:如果当前已经有一个事务存在,并且新事务的传播行为(Propagation)要求挂起当前事务(比如
REQUIRES_NEW
),则当前事务会被挂起,新的事务会开始。 - 方法执行:事务管理器允许方法执行。
- 提交或回滚事务:
- 如果方法执行成功且没有异常抛出,事务管理器会提交事务。
- 如果方法执行过程中抛出异常,根据事务的回滚规则(例如遇到
RuntimeException
回滚),事务管理器会回滚事务。
5. 传播行为和隔离级别
@Transactional
注解允许配置事务的传播行为(Propagation)和隔离级别(Isolation),这些属性控制事务的执行方式:
- 传播行为:定义事务方法如何与现有事务配合,比如
REQUIRED
(默认值,支持当前事务,如果没有则新建一个事务)、REQUIRES_NEW
(总是新建一个事务,挂起当前事务)等。 - 隔离级别:定义事务中操作的数据的可见性,比如
READ_UNCOMMITTED
、READ_COMMITTED
、REPEATABLE_READ
、SERIALIZABLE
等。
示例代码
@Service
public class UserService {
@Transactional
public void createUser(User user) {
userRepository.save(user);
accountService.createAccount(user);
}
}
在这个例子中,createUser
方法被 @Transactional
注解修饰,Spring 会在这个方法调用前开始一个事务,并在方法调用后根据执行结果提交或回滚事务。
总结
@Transactional
的底层实现涉及 AOP、代理模式、事务管理器以及事务的传播行为和隔离级别控制。它通过这些机制确保了事务的原子性、一致性、隔离性和持久性(ACID)。
Powered by Waline v3.2.0