interview
spring
Spring 有哪几种事务传播行为

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 则可能在某些情况下提高性能,因为它们可能不会开启新的事务。

用途

面试事务传播行为是为了评估候选人在处理复杂事务管理时的能力。在实际生产环境中,当涉及到多个数据库操作、分布式系统或需要精细控制事务边界的场景时,选择合适的事务传播行为至关重要。例如,在订单系统中,可能需要在不同模块之间协调事务,以确保数据一致性并防止部分提交或部分回滚的情况。\n

相关问题

🦆
Spring 中如何配置全局事务管理?

可以通过配置文件或编程方式来设置 Spring 的全局事务管理器。通常,使用 PlatformTransactionManager 接口的实现类(如 DataSourceTransactionManager)来管理数据库事务,@Transactional 注解则用于声明事务边界。

🦆
Spring 的事务回滚机制是如何实现的?

Spring 的事务回滚机制通过 AOP(面向切面编程)来实现。@Transactional 注解可以指定哪些异常会触发回滚(例如 RuntimeException),而哪些异常不会触发回滚。默认情况下,未检查异常(RuntimeException)会导致事务回滚。

🦆
在分布式系统中如何实现事务管理?

在分布式系统中,实现事务管理通常需要使用分布式事务协议(如两阶段提交协议 2PC 或 TCC)或借助 Saga 模式进行事务补偿。Spring Cloud 和其他微服务框架可以帮助简化分布式事务的管理。

🦆
如何在 Spring 中处理事务超时?

可以通过 @Transactional 注解的 timeout 属性设置事务的超时时间。超出该时间后,事务将被强制回滚。例如:@Transactional(timeout = 5) 表示事务在 5 秒内未完成则会回滚。

🦆
Spring 中的事务隔离级别有哪几种?

Spring 支持四种事务隔离级别:

1. **ISOLATION_DEFAULT**: 使用底层数据库的默认隔离级别。

2. **ISOLATION_READ_UNCOMMITTED**: 允许读取尚未提交的数据,可能导致脏读。

3. **ISOLATION_READ_COMMITTED**: 只允许读取已提交的数据,防止脏读。

4. **ISOLATION_REPEATABLE_READ**: 确保同一事务中的多次读取结果一致,防止不可重复读。

5. **ISOLATION_SERIALIZABLE**: 最严格的隔离级别,防止脏读、不可重复读和幻读,但性能较低。