Java培训 Spring事务嵌套的配置方法


  北京星辉Java培训老师指出,在使用Spring管理Service层事务时,会遇到Service方法事务嵌套的问题。当出现事务无法回滚的情况,我们可以用一种自动的方式来完成回滚。星辉Java培训讲师解答Spring事物嵌套的配制方法。

 

Java培训

 

 

Spring的事务传递机制

 

PROPAGATION_REQUIRED 如果当前已经存在一个事物,那么就加入到这个事务中,如果当前没有事物那么久新建一个事物。这是很常见的选择。

PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。

 

    事务传递机制,有PROPAGATION_NESTED机制。

 

    当我们在Service方法中配置了这个方式

 

@Transactional(propagation=Propagation.NESTED)

public void save(Entity entity) {

    //保存实体对象操作

}

 

    运行之后系统异常, 提示当前配置不支持NESTED事务.

 

    如何解决呢?

 

    HibernateTransactionManager中有isNestedTransactionAllowed的判定。

 

protected Object doGetTransaction() {

    HibernateTransactionObject txObject = new HibernateTransactionObject();

    txObject.setSavepointAllowed(isNestedTransactionAllowed());

    //...

}

 

    所以在Hibernate配置中添加nestedTransactionAllowed的配置

 

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">

    <property name="sessionFactory" ref="sessionFactory" />

    <property name="nestedTransactionAllowed" value="true"/>

</bean>

 

然后所有的事务都自动使用嵌套事务了,也不需要修改任何service的代码和配置,可以在service方法上去掉(propagation=Propagation.NESTED)这段。

 

以上就是星辉的Java培训老师为大家提供的Spring事物嵌套的配制方法。更多资讯尽在星辉,关注官方微信全新资讯,一手获取。

 

上一篇:Java和c语言间的差距 谁更有优势
下一篇:毕业三年之内能转行学编程吗?

开班信息