Spring 面试题, Spring 有哪几种事务传播行为?
Spring 面试题, Spring 有哪几种事务传播行为?
QA
Step 1
Q:: Spring 有哪几种事务传播行为?
A:: Spring 提供了七种事务传播行为:
1. **PROPAGATION_REQUIRED**:
默认事务传播行为。如果当前存在事务,则加入该事务;如果没有,则新建一个事务。
2. **PROPAGATION_SUPPORTS**:
支持当前事务,如果当前没有事务,则以非事务方式执行。
3. **PROPAGATION_MANDATORY**:
使用当前事务,如果当前没有事务,则抛出异常。
4. **PROPAGATION_REQUIRES_NEW**:
新建一个事务,如果当前存在事务,则把当前事务挂起。
5. **PROPAGATION_NOT_SUPPORTED**:
以非事务方式执行操作,如果当前存在事务,则将当前事务挂起。
6. **PROPAGATION_NEVER**:
以非事务方式执行,如果当前存在事务,则抛出异常。
7. **PROPAGATION_NESTED**:
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则与 PROPAGATION_REQUIRED 行为类似。
Step 2
Q:: PROPAGATION_REQUIRES_NEW 与 PROPAGATION_NESTED 的区别是什么?
A:: PROPAGATION_REQUIRES_NEW 总是新建一个独立的事务,并挂起当前事务。而 PROPAGATION_NESTED 则是在当前事务内开启一个嵌套的子事务,子事务可以单独回滚,但回滚不会影响父事务,而父事务回滚会导致整个事务(包括子事务)回滚。
Step 3
Q:: 为什么 Spring 的事务传播行为如此重要?
A:: 事务传播行为决定了在不同的业务场景下,事务该如何传播和处理。特别是在复杂的分布式系统或涉及多个数据库操作的业务逻辑中,选择合适的传播行为可以确保数据的一致性和系统的可靠性。
Step 4
Q:: Spring 如何管理事务的传播行为?
A:: Spring 通过 @Transactional 注解来管理事务的传播行为。可以在该注解的 propagation 属性中指定所需的传播行为,例如:@Transactional(propagation = Propagation.REQUIRED)
。
Step 5
Q:: 事务传播行为如何影响性能?
A:: 不同的事务传播行为会对系统性能产生不同影响。例如,PROPAGATION_REQUIRES_NEW 会新建事务,这通常需要额外的资源,可能会导致性能下降。而 PROPAGATION_SUPPORTS 和 PROPAGATION_NOT_SUPPORTED 则可能在某些情况下提高性能,因为它们可能不会开启新的事务。