1、引入依赖
首先,确保你的Spring Boot项目中包含了对事务支持的依赖。对于大多数应用场景,Spring Boot会自动引入事务管理相关的依赖。但如果你需要手动添加,可以检查spring-boot-starter-data-jpa
(针对JPA)或spring-boot-starter-jdbc
(针对JDBC)等起步依赖是否已经存在于你的pom.xml
或build.gradle
文件中。
2、使用@Transactional注解
在Service层的方法上添加@Transactional
注解,以声明该方法需要在一个数据库事务中执行。例如:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional // 默认配置,遇到运行时异常(RunTimeException及其子类)会自动回滚事务
public void createUser(User user) {
userRepository.save(user);
// 其他业务逻辑...
}
@Transactional(propagation = Propagation.REQUIRES_NEW) // 需要一个新的事务,即使外层有事务,该方法也会在自己的事务中执行
public void updateUserName(User user, String newName) {
user.setName(newName);
userRepository.save(user);
}
}
3、@Transactional属性说明
- propagation:事务的传播行为,默认为
REQUIRED
,即如果当前存在事务,则加入当前事务;如果不存在,则创建一个新的事务。 - isolation:事务的隔离级别,默认为数据库的默认隔离级别。
- readOnly:是否为只读事务,默认为
false
。 - timeout:事务的超时时间,默认为-1,表示没有超时限制。
- rollbackFor:遇到指定的异常时回滚事务,可以指定多个异常类。
- noRollbackFor:遇到指定的异常时不回滚事务。
4、注意事项
- 确保
@Transactional
注解的方法被Spring管理的Bean调用。直接在main方法或其他非Spring管理的类中调用不会生效。 @Transactional
应放在public方法上。虽然它也可以用于protected或private方法,但必须确保代理模式正确设置,通常建议将其放在public接口方法上。- 异常处理会影响事务的回滚。默认情况下,只有运行时异常(继承自
RuntimeException
的异常)会导致事务回滚。如果你想在遇到特定的已检查异常时也回滚事务,需要使用rollbackFor
属性。(此条一定注意,在使用自定义异常时一定要继承RuntimeException
)