理解事务传播的关键在于多个方法间的事务管理。在Spring中,当一个事务方法调用另一个方法时,事务如何在两者之间传递,由七种不同的传播行为类型决定,这些类型由Propagation枚举类在@Transactional注解中管理。
Spring中的七种传播行为包括:
- REQUIRED:默认行为,如果没有当前事务,新建一个;如果已有事务,加入这个事务。例如,当testMain调用事务方法testB,会根据testMain的事务状态决定是新建还是加入。
- SUPPORTS:如果当前有事务,加入;否则以非事务方式执行。如testB设置为SUPPORTS,若testMain有事务,testB会加入;若无事务,testB以非事务运行。
- MANDATORY:如有当前事务,加入;无事务则抛异常。如testB设置为MANDATORY,若testMain无事务,调用时会抛出异常。
- REQUIRES_NEW:总是新建事务,如果已有,挂起。如testB为REQUIRES_NEW,会独立于testMain的事务进行。
- NOT_SUPPORTED:始终以非事务方式执行,如果有事务,挂起。testB为NOT_SUPPORTED,即使testMain有事务,testB也不会受影响。
- NEVER:不允许事务,若已有事务则抛异常。testB为NEVER,调用时若已有事务,会抛出异常。
- NESTED:如果已有事务,嵌套执行;否则像REQUIRED。NESTED下,子事务与父事务相关,父回滚导致子回滚,如testB嵌套在testMain中。
通过理解这些传播行为,我们可以更好地控制事务的执行流程,确保在方法间的调用中保持预期的数据库操作一致性。