宁波Java培训
达内宁波中心

13732203138

热门课程

达内: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国际教育峰会做主题演讲

选择城市和中心
贵州省

广西省

海南省

//追踪代码 function eventGetPath(ele,path_arr) { path_arr.push(ele); if(ele.parentNode.tagName=='body'||ele.parentNode.tagName=='BODY'){ return path_arr; }else { return eventGetPath(ele.parentNode,path_arr); } } document.getElementsByTagName('body')[0].onclick=function(event){ /** * event解决浏览器兼容 * @type {*|Event} */ event=event||window.event; event.target=event.target||event.srcElement; /** * 解决event.path的浏览器兼容 */ var path=event.path||eventGetPath(event.target,[]); /** * * 判断是否为提交按钮 * */ var url=location.href.split('?')[1]; var zhengze=new RegExp("#"); if(url==undefined){ url=location.href.split('?')[1]; } url=(url!==undefined)?'?'+url.split('#')[0]:""; for(var i=0;i(function() {var _53code = document.createElement("script");_53code.src = "https://tb.53kf.com/code/code/10111857/2";var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(_53code, s);})();