首页 > 代码库 > Spring中注解事务方面的问题

Spring中注解事务方面的问题

我们可以在spring的配置文件beans.xml中对事务进行注解配置,这样在相应的类中就不用对事务进行管事,对于某个类,想单独交给spring来管理,那么就在相应的类上加入@Transactional来标记事务。 

在默认情况下spring对于运行时的异常RuntimeException,是会进行回滚操作,如果在相应的方法上面加入@Transactional(noRollbackFor =RuntimeException.class),表示对于出现RuntimeException这样的异常不进行回滚,就可以改变spring默认事务的行为,而不对事务进行回滚。 

spring对于Exception异常,默认是不会回滚的,如果相让Spring来改变这种默认的行为,那么可以在相应的方法上面加入@Transactional(rollbackFor=Exception.class)设置成回滚,从而改变默认的行为。 


Spring的几种注解事务传播行为 

Required:业务方法需要在一个事务中运行。如果方法运行时,已经在一个事务中,那么加入到该事务,否则自己创建一个新的事务。一般spring默认都是这种事务,像保存,删除,修改等都是这种事务。80%的情况下都用这种事务。 

Not_Supported:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为它开启事务。如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会执行。 

Requiresnew:属性不管是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务被挂起,新的事务会被创建,直到方法执行结束,新事务才算结束,原先事务才会恢复执行。 


Mandatory:该属性指定业务方法必须在一个事务中运行,业务方法不能发起自己的事略。如果业务方法在没有事务的环境下调用,容器会抛出例外。 


Supports:这一事务属性表明,如果方法在某个事务范围内被调用,则方法成为该事务的一部分。如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行。 


Never:指定业务方法绝对不能在事务范围内执行。如果业务方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,才能正常执行。 


上面的事略在ejb中都会存在。只有下面的事务才是spring自己提供的。 


Nested:如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动事务,则按Required属性执行,它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响,它只对DataSourceTransactionManager事务管理器起效。 


Java代码  收藏代码
    1. Connection conn = null;  
    2. try {  
    3.     conn.setAutoCommit(false);  
    4.     Statement stmt = conn.createStatement();  
    5.     stmt.executeUpdate("update person set name=‘888‘ where id=1");  
    6.     Savepoint savepoint = conn.setSavepoint();//外部事务会设置一个保存点。  
    7. //---------------------------------------在内部事略中出现错误,是不会影响外部事务的运行.同种外部事务如果出错,也不会影响内部事务的执行.这就是NESTED事务.我们通过@Resource注入的事务就是这种形式的事务  
    8.     try{     
    9.             conn.createStatement().executeUpdate("update person set name=‘222‘ where sid=2");  
    10.     }catch(Exception ex){  
    11.             conn.rollback(savepoint);      
    12.      }  
    13. //---------------------------------------  
    14.       stmt.executeUpdate("delete from person where id=9");  
    15.       conn.commit();  
    16.        stmt.close();  
    17.     } catch (Exception e) {  
    18.          conn.rollback();  
    19.      }finally{  
    20.                try {  
    21.         if(null!=conn && !conn.isClosed()) conn.close();  
    22.                 } catch (SQLException e) { e.printStackTrace(); }  
    23.      }  
    24. }