@Transactional
注解在 Spring Boot 中用于管理事务。它确保在方法执行过程中,所有数据库操作要么全部成功,要么全部回滚,以维护数据的一致性。下面是一些使用 @Transactional
的示例:
1. 在服务层使用 @Transactional
java
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public void createUser(User user) {
userRepository.save(user);
// 其他数据库操作
}
}
在上面的例子中,如果 createUser
方法中的任何数据库操作(如 save
方法)失败,所有已完成的操作都会被回滚。
2. 设置 @Transactional
的属性
你可以通过属性来定制事务的行为:
-
readOnly
: 指定事务是否只读。用于优化查询性能。 -
rollbackFor
: 指定哪些异常应该触发事务回滚。 -
propagation
: 定义事务的传播行为(例如REQUIRED
,REQUIRES_NEW
等)。
示例:
java
@Transactional(readOnly = true)
public List<User> getAllUsers() {
return userRepository.findAll();
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public void updateUser(User user) throws Exception {
userRepository.save(user);
// 其他数据库操作
if (someConditionFails()) {
throw new Exception("更新失败");
}
}
getAllUsers
方法被标记为只读事务,因此不允许对数据库进行修改。updateUser
方法被配置为当抛出Exception
时回滚,且即使当前已经存在事务,也会启动一个新的事务。
3. 事务回滚
默认情况下,@Transactional
只会在遇到 RuntimeException
时回滚事务。如果你想在 checked exception
(如 IOException
)时也回滚事务,可以指定 rollbackFor
属性:
java
@Transactional(rollbackFor = IOException.class)
public void someMethod() throws IOException {
// 数据库操作
if (someConditionFails()) {
throw new IOException("IO异常,回滚事务");
}
}
4. 自定义回滚条件
你可以基于自定义的逻辑回滚事务:
java
@Transactional
public void deleteUser(Long userId) {
User user = userRepository.findById(userId).orElseThrow(() -> new RuntimeException("用户未找到"));
userRepository.delete(user);
if (someCustomCondition()) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
在 deleteUser
方法中,如果 someCustomCondition()
返回 true
,则手动设置当前事务为回滚状态。