@Transactional 是 Spring 框架中的一个注解,它用于声明一个方法或类需要进行事务管理。当你在方法或类上使用此注解时,Spring 会确保该方法或类中的所有数据库操作都在一个事务中执行。如果事务中的某个操作失败,则整个事务将被回滚,以确保数据的一致性。
用法
在方法上使用:
@Service
public class MyService {
@Transactional
public void someTransactionalMethod() {
// ... 数据库操作 ...
}
}
在类上使用:当在类上使用 @Transactional 注解时,该类中的所有公共方法都将运行在事务中。
@Service
@Transactional
public class MyService {
public void method1() {
// ... 数据库操作 ...
}
public void method2() {
// ... 数据库操作 ...
}
}
指定传播行为、隔离级别等:你可以通过注解的参数来指定事务的传播行为、隔离级别、只读属性等。
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE, readOnly = false)
public void someSpecialMethod() {
// ...
}
原理
AOP(面向切面编程):Spring 通过 AOP 代理来管理事务。当你对一个类或方法添加 @Transactional 注解时,Spring 会为该类或方法创建一个代理。这个代理会在方法调用前后添加额外的逻辑来管理事务。
事务管理器:Spring 使用 PlatformTransactionManager 接口的实现类(如 DataSourceTransactionManager、JpaTransactionManager 等)来管理事务。这些管理器负责与底层数据库进行交互,以确保事务的正确开始、提交或回滚。
事务属性:通过 @Transactional 注解,你可以指定多种事务属性,如传播行为(Propagation)、隔离级别(Isolation)、只读(ReadOnly)和回滚规则(rollbackFor、noRollbackFor)等。这些属性决定了事务如何与现有的事务进行交互、事务的可见性以及其他事务特性。
事务传播行为:Spring 支持七种不同的事务传播行为,例如 REQUIRED、REQUIRES_NEW、NESTED 等。这些传播行为决定了当一个事务方法被另一个事务方法调用时应该如何处理事务。
事务隔离级别:为了防止多个事务并发执行时产生的问题(如脏读、不可重复读、幻读等),数据库提供了隔离级别来控制事务之间的可见性。Spring 支持所有的 SQL 标准隔离级别,如 READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ 和 SERIALIZABLE。
自动提交与回滚:如果事务方法成功完成,则事务会自动提交。如果在事务方法中抛出了未检查的异常(即运行时异常),则事务会自动回滚。你也可以通过 @Transactional 注解的 rollbackFor 和 noRollbackFor 属性来自定义回滚规则。
总之,@Transactional 注解是 Spring 框架中用于声明式事务管理的强大工具,它简化了事务管理的复杂性,并允许开发者通过简单的注解来控制事务行为。