关于spring的事务管理,百思不得其解,哪位高人给看下哪里出问题了
1.由于数据库设计要求全局主键都唯一,因此设计了一个存储过程用于生成之
(防止并发出问题,存储过程加了行锁),并且方法放在了dao层中,
 要求该方法不论seivece层执行成功与否都要提交,(单独的事务管理)
/*
 * in based dao
 */
  public void getPrimaryKey() throws SomeException{
   //执行生成主键存储过程
  }
  /*
   * in services层
   */
  pulic void addToDataBase() throws OtherExceptioin{
   
    this.dao.getPrimaryKey();   
    //do others      
  }
  sping配置文件
  
   <!-- 配置Advice(事务的传播特性) -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="getPrimaryKey" propagation="REQUIRES_NEW" />
<tx:method name="add*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice> <!-- 配置事务管理器应用的范围 -->
<aop:config>
<aop:pointcut id="affectMethods"
expression="execution(* com.sfzc.jlny.biz.impl.*.*(..)) 
OR execution(* com.sfzc.jlny.dao.impl.Bm23BaseDAO.getPrimaryKey(*))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="affectMethods" />
</aop:config>  

现在的问题是 为什么将生成主键的方法的事务配置成REQUIRES_NEW后在 services层中 执行完
getPrimaryKey后 事务并没有提交,而是一旦service层抛出异常后两者一起回滚了,即单独的
REQUIRES_NEW事务管理没起作用。而我去掉getPrimaryKey的spring事务管理后,自己在getPrimaryKey
方法里 getSession.beginTransaction(),commit然后提交就一切正常。会是哪里出问题了呢?希望大家能给一些
指点,在此谢过了。

解决方案 »

  1.   

    1、调用getPrimaryKey()地方是不是还存在事务(嵌套事务则要用NESTED)?
    2、Aop配置有没有经过测试(拦截是否生效)?
      

  2.   

    如果你用的jpa,建议在service接口的方法addToDataBase前面加上注解@Transactional(propagation = Propagation.REQUIRES_NEW)。我就是这样解决的,写在配置文件里面好像不起作用
      

  3.   

    跟我的遇到的问题一样。我怀疑是hibernate一个请求只有一个单利session。所以这个required_new 失效了。我也在想办法啊。郁闷。