@Transactional
注解是 Spring 框架中用于声明式事务管理的一个关键特性。通过使用这个注解,可以在不编写额外代码的情况下,管理数据库操作的事务边界。@Transactional
可以被应用到类级别或方法级别上,用于指定哪些方法在执行时需要被事务支持。
基本使用
- 添加依赖:
确保项目中包含了 Spring Transaction Management 的依赖。对于 Maven 项目,需要在
pom.xml
文件中添加如下依赖(版本可能根据 Spring 版本而有所不同):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-transaction-manager</artifactId>
</dependency>
- 使用
@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 配置正确以支持事务管理。