@Transcation 事务注解
@Transcation 事务注解
关于事务注解 @Transcation 的使用, 以及事务的介绍
在 Spring Boot 中,@Transactional
注解用于声明方法或类的事务特性。事务是一种机制,确保一系列操作要么全部成功,要么全部失败,从而保证数据的一致性和完整性。
@Transactional
注解的作用
@Transactional
注解通常用于业务层的服务方法上,它可以管理方法中的事务边界。注解在方法或类上使用时,可以控制数据库操作的提交和回滚。
注解的属性
@Transactional
提供了一些属性来配置事务的行为。常用的属性包括:
- propagation:事务的传播行为,默认值是
Propagation.REQUIRED
。 - isolation:事务的隔离级别,默认值是
Isolation.DEFAULT
。 - timeout:事务超时,默认值是 -1(表示没有超时)。
- readOnly:事务是否为只读,默认值是
false
。 - rollbackFor:触发回滚的异常类型,默认值是
RuntimeException
。 - noRollbackFor:不触发回滚的异常类型。
示例分析
1
2
3
4
5
6
7
8
@Service
public class MyService {
@Transactional(rollbackFor = Exception.class)
public void myTransactionalMethod() {
// 方法体
}
}
在这个示例中,@Transactional(rollbackFor = Exception.class)
作用在 myTransactionalMethod
方法上。
rollbackFor
属性
rollbackFor = Exception.class
:指定在遇到Exception
类的异常时回滚事务。默认情况下,只有RuntimeException
或其子类会触发事务回滚,通过指定rollbackFor = Exception.class
,可以确保即使遇到非RuntimeException
(例如checked exception
),事务也会回滚。
事务传播行为(propagation)
事务传播行为定义了在遇到已经存在的事务时,新的事务应该如何进行。常见的传播行为有:
- REQUIRED(默认值):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
- REQUIRES_NEW:总是创建一个新的事务。如果当前存在事务,则将当前事务挂起。
- SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。
- NOT_SUPPORTED:总是以非事务方式执行。如果当前存在事务,则将当前事务挂起。
- MANDATORY:必须在事务中执行。如果当前没有事务,则抛出异常。
- NEVER:必须在非事务中执行。如果当前存在事务,则抛出异常。
- NESTED:如果当前存在事务,则创建一个事务嵌套在当前事务中;如果当前没有事务,则创建一个新的事务。
事务隔离级别(isolation)
事务隔离级别控制并发事务之间的行为。常见的隔离级别有:
- DEFAULT:使用底层数据库的默认隔离级别。
- READ_UNCOMMITTED:允许读取未提交的数据,可能会出现脏读。
- READ_COMMITTED:只能读取已提交的数据,防止脏读。
- REPEATABLE_READ:确保在整个事务期间,数据的读取是一致的,防止不可重复读。
- SERIALIZABLE:最高的隔离级别,完全隔离事务,防止脏读、不可重复读和幻读。
使用示例
假设我们有一个简单的用户服务,包含一个添加用户的方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional(rollbackFor = Exception.class)
public void addUser(User user) {
userRepository.save(user);
// 如果这里抛出任何异常,事务会回滚
if (someCondition) {
throw new Exception("Some exception");
}
}
}
在这个示例中,如果 addUser
方法在保存用户后抛出任何异常,事务将回滚,userRepository.save(user)
的操作也会被撤销。
总结
通过使用 @Transactional
注解,Spring Boot 可以为方法或类管理事务边界,确保数据的一致性和完整性。rollbackFor
属性允许开发者指定哪些异常会触发事务回滚,从而提供更细粒度的控制。理解和正确配置事务特性对于构建健壮的应用程序至关重要。
本文由作者按照 CC BY 4.0 进行授权