Spring事务的传播行为 详解
时间: 2023-08-23 09:39:46 浏览: 89
Spring中事务的传播属性详解
5星 · 资源好评率100%
Spring事务的传播行为指的是一个事务方法调用另一个事务方法时,事务如何传播的行为。Spring框架提供了7种事务传播行为,分别是REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER和NESTED。
1. REQUIRED
如果当前没有事务,则创建一个新事务。如果当前存在事务,则加入该事务中。这是默认的传播行为。
示例代码:
```java
@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
// 业务逻辑
method2(); // 调用method2方法
}
@Transactional(propagation = Propagation.REQUIRED)
public void method2() {
// 业务逻辑
}
```
在method1方法中调用method2方法时,如果method2方法没有事务,则会加入method1方法的事务中。
2. SUPPORTS
如果当前有事务,则加入该事务中。如果当前没有事务,则以非事务方式执行。
示例代码:
```java
@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
// 业务逻辑
method2(); // 调用method2方法
}
@Transactional(propagation = Propagation.SUPPORTS)
public void method2() {
// 业务逻辑
}
```
在method1方法中调用method2方法时,如果method1方法有事务,则method2方法会加入method1方法的事务中。如果method1方法没有事务,则method2方法会以非事务方式执行。
3. MANDATORY
如果当前有事务,则加入该事务中。如果当前没有事务,则抛出异常。
示例代码:
```java
@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
// 业务逻辑
method2(); // 调用method2方法
}
@Transactional(propagation = Propagation.MANDATORY)
public void method2() {
// 业务逻辑
}
```
在method1方法中调用method2方法时,如果method1方法有事务,则method2方法会加入method1方法的事务中。如果method1方法没有事务,则会抛出异常。
4. REQUIRES_NEW
如果当前有事务,则挂起该事务,并创建一个新事务。如果当前没有事务,则创建一个新事务。
示例代码:
```java
@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
// 业务逻辑
method2(); // 调用method2方法
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void method2() {
// 业务逻辑
}
```
在method1方法中调用method2方法时,如果method1方法有事务,则method2方法会挂起method1方法的事务,并创建一个新事务。如果method1方法没有事务,则method2方法会创建一个新事务。
5. NOT_SUPPORTED
以非事务方式执行。如果当前存在事务,则挂起该事务。
示例代码:
```java
@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
// 业务逻辑
method2(); // 调用method2方法
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void method2() {
// 业务逻辑
}
```
在method1方法中调用method2方法时,如果method1方法有事务,则method2方法会以非事务方式执行。如果method1方法没有事务,则method2方法也会以非事务方式执行。
6. NEVER
以非事务方式执行。如果当前存在事务,则抛出异常。
示例代码:
```java
@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
// 业务逻辑
method2(); // 调用method2方法
}
@Transactional(propagation = Propagation.NEVER)
public void method2() {
// 业务逻辑
}
```
在method1方法中调用method2方法时,如果method1方法有事务,则会抛出异常。如果method1方法没有事务,则method2方法会以非事务方式执行。
7. NESTED
如果当前有事务,则在该事务中嵌套一个新事务,如果当前没有事务,则创建一个新事务。
示例代码:
```java
@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
// 业务逻辑
method2(); // 调用method2方法
}
@Transactional(propagation = Propagation.NESTED)
public void method2() {
// 业务逻辑
}
```
在method1方法中调用method2方法时,如果method1方法有事务,则在该事务中嵌套一个新事务。如果method1方法没有事务,则method2方法会创建一个新事务。
阅读全文