一、Spring事务传播机制有哪些
Spring事务传播机制是指在多个事务方法相互调用的场景下,各方法之间事务如何进行传播和协作的机制。
常见的事务传播机制包括:PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER、PROPAGATION_NESTED。
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { // do something methodB(); } @Transactional(propagation = Propagation.REQUIRED) public void methodB() { // do something }
二、Spring事务传播机制例题详解
下面来看一个例子,有三个方法methodA、methodB、methodC,其中methodB由methodA调用,methodC由methodB调用,都开启了事务传播机制,并且都抛出了异常。
在这种情况下,Spring事务传播机制会怎么样呢?
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { // do something methodB(); } @Transactional(propagation = Propagation.REQUIRES_NEW) public void methodB() { // do something methodC(); throw new RuntimeException(); } @Transactional(propagation = Propagation.REQUIRED) public void methodC() { // do something throw new RuntimeException(); }
首先,如果methodA或methodB的事务提交失败,就会回滚整个事务。如果methodC的事务提交失败,只会回滚methodC的事务,不会影响methodA和methodB的事务。
其次,当methodA调用methodB时,methodA的事务将成为methodB事务的一部分,并且在methodB返回时一并提交。所以,如果methodA和methodB都抛出了异常时,methodA的事务将被回滚,而methodB的事务不会影响到methodA。
最后,当methodB调用methodC时,由于methodC开启了一个新的事务,所以methodB的事务将被挂起,并且methodB的事务和methodC的事务没有直接关联。如果methodB抛出了异常时,只会回滚methodB的事务。如果methodC抛出了异常时,会回滚methodC的事务,并将异常抛给methodB。
三、Spring事务传播机制实现原理
spring事务的实现原理主要是通过aop来实现。spring通过动态代理对方法进行包装,在方法调用前后加入开启和提交事务的操作。
在调用具有事务属性的方法时,spring会创建一个TransactionInfo对象,用来记录方法的事务属性。然后,spring会根据事务属性来判断当前事务是否存在,如果不存在,则创建一个新的事务,并将其保存在TransactionSynchronizationManager中,以便后续操作。
如果当前事务已经存在,则根据当前事务的传播属性来判断是否需要开启新的事务。如果需要开启新的事务,则创建一个新的事务,并将其保存在TransactionSynchronizationManager中。否则,直接使用当前事务。
在方法执行结束后,spring会根据事务的提交情况来判断是否需要提交或回滚事务。如果方法抛出了异常,则会回滚事务,否则提交事务。
四、Spring事务传播机制和隔离级别
Spring事务传播机制和隔离级别是两个独立的概念,但是它们常常一起使用来保障数据的一致性和完整性。
事务的隔离级别是指多个并发事务之间的隔离程度,常见的隔离级别包括:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE。
在Spring事务传播中,通过使用TransactionDefinition接口来定义事务的隔离级别。
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED) public void methodA() { // do something }
五、Spring事务传播机制面试题
以下是一些常见的关于Spring事务传播机制的面试题:
1. Spring默认的事务传播方式是什么?
2. Spring事务传播机制和事务隔离级别有什么区别?
3. Spring事务失效的场景有哪些?
4. Spring的事务管理是如何实现的?
六、Spring默认事务传播机制
在spring中,默认的事务传播方式是PROPAGATION_REQUIRED。
PROPAGATION_REQUIRED是指如果当前已经存在事务,则加入这个事务,否则开启一个新的事务。
PROPAGATION_REQUIRED是默认的事务传播方式,也是最常用的事务传播方式。在大多数情况下,我们不需要对其进行额外的配置。
七、Spring事务传播方式
以下是spring事务传播方式的一些常用示例:
1. PROPAGATION_REQUIRED:如果当前已经存在事务,则加入这个事务,否则开启一个新的事务。
2. PROPAGATION_SUPPORTS:如果当前已经存在事务,则加入这个事务,否则以非事务的方式运行。
3. PROPAGATION_MANDATORY:如果当前已经存在事务,则加入这个事务,否则抛出异常。
4. PROPAGATION_REQUIRES_NEW:无论当前是否存在事务,都开启一个新的事务。
5. PROPAGATION_NOT_SUPPORTED:以非事务的方式运行,如果当前已经存在事务,则挂起该事务。
6. PROPAGATION_NEVER:以非事务的方式运行,如果当前已经存在事务,则抛出异常。
7. PROPAGATION_NESTED:如果当前已经存在事务,则在当前事务中开启一个嵌套事务,否则开启一个新的事务。
八、Spring事务传播属性有哪些
在定义事务传播方式时,还可以指定一些属性来更好地控制事务的行为。
以下是一些常用的事务传播属性:
1. readOnly:标识当前事务是否为只读事务。
2. timeout:指定当前事务的超时时间,单位为秒。
3. rollbackFor:指定哪些异常需要回滚事务。
4. noRollbackFor:指定哪些异常不需要回滚事务。
5. value、transactionManager:指定事务管理器的名称。
九、Spring事务传播机制生效条件
在使用Spring事务传播机制时,需要注意以下几点:
1. 所有的事务传播方式都必须在同一个事务管理器中生效,否则无法实现事务传播。
2. 当前方法必须是public方法,并且不能被static修饰。
3. 事务传播方式的生效要求当前方法处于被spring管理的bean中,而不是静态方法中。
以上是关于Spring事务传播机制的详细介绍,希望对大家有所帮助。