1. REQUIRED(需要事务)
- 行为: 内层加入外层事务,若无外层事务则新建。
- 场景: 确保操作整体一致。
代码示例
java
@Service
public class UserService {
@Autowired private UserRepository userRepo;
@Autowired private OrderService orderService;
@Transactional(propagation = Propagation.REQUIRED)
public void createUserAndOrder(String username) {
userRepo.save(new User(username));
orderService.createOrder(username);
}
}
@Service
public class OrderService {
@Autowired private OrderRepository orderRepo;
@Transactional(propagation = Propagation.REQUIRED)
public void createOrder(String username) {
orderRepo.save(new Order(username));
throw new RuntimeException("Order failed");
}
}
- 结果: 内外层共用事务A,异常后整体回滚。
2. SUPPORTS(支持事务)
- 行为: 有外层事务则加入,无则非事务执行。
- 场景: 查询等轻量操作。
代码示例
java
@Transactional(propagation = Propagation.SUPPORTS)
public void logOperation(String operation) {
logRepo.save(new Log(operation));
}
- 结果: 外层有事务则加入,无事务则独立执行。
3. MANDATORY(强制事务)
- 行为: 必须有外层事务,否则抛异常。
- 场景: 强制事务环境。
代码示例
java
@Transactional(propagation = Propagation.MANDATORY)
public void mandatoryOperation(String data) {
dataRepo.save(new Data(data));
}
- 结果 : 无外层事务抛
IllegalTransactionStateException
。
4. REQUIRES_NEW(需要新事务)
- 行为: 内层新建事务,外层事务挂起。
- 场景: 独立提交子操作。
代码示例
java
@Service
public class TransactionService {
@Autowired private LogRepository logRepo;
@Transactional(propagation = Propagation.REQUIRED)
public void outerMethod() {
logRepo.save(new Log("Outer"));
innerMethod();
throw new RuntimeException("Outer failed");
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void innerMethod() {
logRepo.save(new Log("Inner"));
}
}
- 结果: 内层事务提交,外层事务回滚。
5. NOT_SUPPORTED(不支持事务)
- 行为: 内层非事务执行,外层事务挂起。
- 场景: 无事务需求操作。
代码示例
java
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void nonTransactionalOperation(String data) {
dataRepo.save(new Data(data));
}
- 结果: 内层无事务,外层事务暂停。
6. NEVER(从不支持事务)
- 行为: 内层非事务执行,外层有事务则抛异常。
- 场景: 禁止事务环境。
代码示例
java
@Transactional(propagation = Propagation.NEVER)
public void neverTransactionalOperation(String data) {
dataRepo.save(new Data(data));
}
- 结果 : 外层有事务抛
IllegalTransactionStateException
。
7. NESTED(嵌套事务)
- 行为: 内层嵌套于外层事务,可独立回滚。
- 场景: 子操作独立控制。
代码示例
java
@Service
public class NestedService {
@Autowired private LogRepository logRepo;
@Transactional(propagation = Propagation.REQUIRED)
public void outerMethod() {
logRepo.save(new Log("Outer"));
try {
innerMethod();
} catch (Exception e) {}
}
@Transactional(propagation = Propagation.NESTED)
public void innerMethod() {
logRepo.save(new Log("Inner"));
throw new RuntimeException("Inner failed");
}
}
- 结果: 内层回滚,外层提交。
传播行为细化表格
传播行为 | 外层有事务时 | 外层无事务时 | 内层事务行为 | 外层回滚 | 内层回滚 |
---|---|---|---|---|---|
REQUIRED | 内层加入外层事务 | 内层新建事务 | 与外层共用事务 | 是(整体回滚) | 是(整体回滚) |
SUPPORTS | 内层加入外层事务 | 内层非事务执行 | 随外层事务状态 | 是(随外层) | 是(随外层) |
MANDATORY | 内层加入外层事务 | 抛异常 | 与外层共用事务 | 是(整体回滚) | 是(整体回滚) |
REQUIRES_NEW | 外层挂起,内层新建 | 内层新建事务 | 独立事务 | 是(不影响内层) | 是(不影响外层) |
NOT_SUPPORTED | 外层挂起,内层非事务 | 内层非事务执行 | 无事务 | 否(暂停期间) | 否(无事务) |
NEVER | 抛异常 | 内层非事务执行 | 无事务 | 否(无执行) | 否(无事务) |
NESTED | 内层嵌套外层事务 | 内层新建事务 | 嵌套事务(可独立回滚) | 是(整体回滚) | 是(独立回滚) |
总结
Spring事务传播机制的核心在于内外层事务的协调:
- 一致性强 :
REQUIRED
和MANDATORY
适合整体事务。 - 独立性强 :
REQUIRES_NEW
和NESTED
适合子操作隔离。 - 无事务需求 :
NOT_SUPPORTED
和NEVER
避免事务开销。