spring 事务不起作用?

7 浏览
0 Comments

spring 事务不起作用?

嗨,我正在尝试使用Spring和Hibernate开发具有事务的应用程序,我正在使用Spring 4.x和Hibernate 4.x,以下是我的代码片段:

applicationContext.xml


     
     
     
    

servlet-context.xml


     
 
      
    
  
        
            
                
            
        
     

persistance.xml


            
            
            
            
      
    
        
            
        
               
        
            
                  org.hibernate.dialect.MySQLDialect
                  true           
                  false    
            
        
    
     
   
    

最后,meservice看起来像这样:

@Transactional(propagation=Propagation.REQUIRED,rollbackFor=RuntimeException.class)
    public Object loadCategories(UserContactsInputVO inputVo) {
        User user= getUserObject(inputVo);
        userDAO.saveOrUpdateForTrancasction(user);
        System.out.println(user.getUserId());
        //getAudioFilesBasedOnCategories();
        try{
            return getAudioFilesBasedOnCategories();
        }catch (RuntimeException e) {
            e.printStackTrace();
        }
        return new CategoryResponseVo();
    }

@Transactional(propagation=Propagation.REQUIRED)
    public CategoryResponseVo  getAudioFilesBasedOnCategories()
    {
        try{
            if(true)
        throw new RuntimeException();
        }finally{
        }
        return vo;
    }

在这里发生运行时异常,但数据库记录没有被回滚。

0
0 Comments

spring transaction not working?

事务不起作用的原因是因为RuntimeException没有传播到实际管理事务回滚代码的Spring代理中。而导致它不被传播的原因是你捕获了它并且没有重新抛出。

try{

return getAudioFilesBasedOnCategories();

}catch (RuntimeException e) {

e.printStackTrace(); //**THIS IS WRONG**

}

而应该这样做

try{

return getAudioFilesBasedOnCategories();

}catch (RuntimeException e) {

//记录错误

throw e; //重新抛出

}

而且你可能不需要给rollbackFor属性,默认情况下RuntimeException会导致事务回滚。

(propagation=Propagation.REQUIRED) public CategoryResponseVo getAudioFilesBasedOnCategories() 是上述方法需要使用@transaction的原因吗?... 根据我的了解,如果发生异常,它会继续当前事务并确认当前事务。

这与异常情况下的事务行为无关。它只是告诉事务管理器此方法的调用需要一个正在运行的事务。如果已经存在一个事务正在进行中,则该方法调用将在同一事务中调用,否则将启动一个新的事务。这通常用于确保即使在没有服务层的情况下调用,该方法的调用也在事务下运行。请参考stackoverflow.com/questions/10740021/…

0