@Transactional使用方法
时间: 2023-11-21 21:57:56 浏览: 34
@Transactional是Spring框架中用于管理事务的注解,可以作用于接口、类、类方法。具体使用方法如下:
1.作用于类:表示所有该类的public方法都配置相同的事务属性信息。
```java
@Transactional
public class UserServiceImpl implements UserService {
//...
}
```
2.作用于方法:表示该方法需要进行事务管理。
```java
@Transactional
public void addUser(User user) {
//...
}
```
3.指定事务的传播行为(propagation):
```java
@Transactional(propagation = Propagation.REQUIRED)
public void addUser(User user) {
//...
}
```
常用的传播行为有:
- REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。
- SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
- MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。
- REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
- NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
- NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与REQUIRED类似的操作。
4.指定事务的隔离级别(isolation):
```java
@Transactional(isolation = Isolation.READ_COMMITTED)
public void addUser(User user) {
//...
}
```
常用的隔离级别有:
- DEFAULT:使用数据库默认的隔离级别。
- READ_UNCOMMITTED:读取未提交的数据,可能会导致脏读、不可重复读、幻读等问题。
- READ_COMMITTED:读取已提交的数据,可以避免脏读问题,但是不可重复读和幻读问题仍然存在。
- REPEATABLE_READ:可重复读,可以避免脏读和不可重复读问题,但是幻读问题仍然存在。
- SERIALIZABLE:串行化,可以避免脏读、不可重复读和幻读问题,但是性能较差。
5.指定事务的超时时间(timeout):
```java
@Transactional(timeout = 10)
public void addUser(User user) {
//...
}
```
超时时间单位为秒。
6.指定不回滚的异常类型(noRollbackFor):
```java
@Transactional(noRollbackFor = {NullPointerException.class, IllegalArgumentException.class})
public void addUser(User user) {
//...
}
```
指定的异常类型抛出时,不会回滚事务。
7.指定回滚的异常类型(rollbackFor):
```java
@Transactional(rollbackFor = Exception.class)
public void addUser(User user) {
//...
}
```
指定的异常类型抛出时,会回滚事务。