@Transactional 注解是 Spring 框架中用于声明式事务管理的一个关键特性。通过使用这个注解,可以在不编写额外代码的情况下,管理数据库操作的事务边界。@Transactional 可以被应用到类级别或方法级别上,用于指定哪些方法在执行时需要被事务支持。

基本使用

  1. 添加依赖: 确保项目中包含了 Spring Transaction Management 的依赖。对于 Maven 项目,需要在 pom.xml 文件中添加如下依赖(版本可能根据 Spring 版本而有所不同):
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-transaction-manager</artifactId>
</dependency>


  1. 使用 @Transactional 注解
  • 方法级别: 将 @Transactional 注解应用于一个服务层的方法上,表示该方法的执行将在一个事务的上下文中进行。
@Service
public class SomeService {

    @Transactional
    public void someBusinessMethod() {
        // 数据库操作
    }
}
  • 类级别: 当将 @Transactional 注解应用于类级别时,该类中的所有公共方法都将被视为事务性的,除非它们被 @Transactional(propagation = Propagation.NOT_SUPPORTED) 等明确标注为非事务性的。
@Service
@Transactional
public class AnotherService {

    public void anotherBusinessMethod() {
        // 数据库操作
    }

    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public void nonTransactionalMethod() {
        // 非事务性操作
    }
}

事务属性

@Transactional 注解支持多个属性,用于定制事务的行为:

  • propagation:定义事务的传播行为。例如,Propagation.REQUIRED 表示当前方法必须运行在事务中,如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  • isolation:定义事务的隔离级别。例如,Isolation.DEFAULT 表示使用底层数据库的默认隔离级别。
  • timeout:定义事务的超时时间,单位为秒。默认值为 -1,表示没有超时限制。
  • readOnly:标记事务是否为只读事务。只读事务有助于某些数据库进行优化。
  • rollbackFor:指定哪些异常必须导致事务回滚。默认情况下,运行时异常和错误会导致事务回滚。
  • noRollbackFor:指定哪些异常不应该导致事务回滚。

注意事项

  • @Transactional 注解仅在由 Spring 容器管理的 bean 上有效。如果直接在 main 方法中或者非 Spring 管理的类中调用这些方法,事务管理将不会生效。
  • @Transactional 注解不应该用于接口定义上,因为注解不能继承到实现类中。应该直接将它应用于具体的类或者方法上。
  • 在使用 @Transactional 时,要注意异常的处理,确保方法在遇到预期之外的异常时能够正确地回滚事务。
  • 确保数据源配置了事务管理器,并且 Spring 配置正确以支持事务管理。

@Transactional 注解使用说明_事务管理