Spring 面试题, Spring 事务传播行为有什么用?
Spring 面试题, Spring 事务传播行为有什么用?
QA
Step 1
Q:: 什么是Spring事务传播行为?
A:: Spring事务传播行为(Transaction Propagation Behavior)定义了当事务方法被调用时,事务应该如何进行传播。Spring通过TransactionDefinition接口的传播选项来控制事务的传播行为。常见的传播行为有:REQUIRED、REQUIRES_NEW、NESTED等。例如,REQUIRED表示当前方法必须运行在事务中,如果当前已经有一个事务在进行中,该方法将加入该事务;如果没有,Spring将启动一个新的事务。
Step 2
Q:: Spring事务传播行为有哪些类型?
A:: Spring事务传播行为有七种常见类型:
1.
REQUIRED:支持当前事务,如果没有事务则新建一个事务。
2.
REQUIRES_NEW:新建一个事务,如果当前存在事务,挂起当前事务。
3.
NESTED:如果当前事务存在,则嵌套在这个事务中执行。
4.
MANDATORY:支持当前事务,如果当前没有事务,则抛出异常。
5.
NEVER:不支持事务,如果当前存在事务,则抛出异常。
6.
NOT_SUPPORTED:不支持当前事务,当前事务存在时挂起当前事务。
7.
SUPPORTS:如果当前事务存在,则支持事务;如果不存在,则非事务性地执行。
Step 3
Q:: REQUIRED和REQUIRES_NEW之间的区别是什么?
A:: REQUIRED和REQUIRES_NEW是最常用的两种事务传播行为。REQUIRED表示如果方法已经在事务中运行,则加入该事务,如果没有事务,则开启一个新的事务。而REQUIRES_NEW则表示无论是否存在事务,都会开启一个新的事务,并且会挂起当前事务(如果存在的话),直到新事务完成后再恢复之前的事务。这两者的区别在于事务的隔离程度和事务提交回滚的行为不同。
Step 4
Q:: NESTED传播行为是什么?
A:: NESTED传播行为表示如果当前存在事务,嵌套事务将在当前事务中执行,并与当前事务共享同一个连接。嵌套事务有独立的提交和回滚行为,但它的回滚不会影响到外部事务,除非外部事务也回滚。通常在需要部分回滚的场景中使用。
Step 5
Q:: 在Spring中如何设置事务传播行为?
A:: 在Spring中,可以通过@Transactional注解来设置事务的传播行为。比如:@Transactional(propagation = Propagation.REQUIRED)
表示该方法使用REQUIRED传播行为。可以在类或方法级别进行配置,如果方法级别有配置,会覆盖类级别的配置。