宁波Java培训
达内宁波中心

0574-87236644

热门课程

达内:Spring 事务嵌套如何配置

  • 时间:2015-12-17
  • 发布:宁波java培训
  • 来源:PHPERZ


    宁波达内Java培训专家指出,在使用Spring管理Service层事务时,会遇到service方法事务嵌套的问题。当出现事务无法回滚的情况,我们可以用一种自动的方式来完成回滚。 

    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开发必须学会的linux常用命令
下一篇:达内讲解Java的代理模式

达内java大数据班就业喜报,最高月薪达18000元

795万高校毕业生创历史新高,2017届毕业生就业近况几何?

达内Linux学员毕业2周就业率96%,最高薪资10000元

达内教育总裁韩少云受邀出席GIE国际教育峰会做主题演讲

选择城市和中心
贵州省

广西省

海南省