zoukankan      html  css  js  c++  java
  • 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. }  
  • 相关阅读:
    Eclipse 导入项目乱码问题(中文乱码)
    sql中视图视图的作用
    Java基础-super关键字与this关键字
    Android LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)的参数理解
    Android View和ViewGroup
    工厂方法模式(java 设计模式)
    设计模式(java) 单例模式 单例类
    eclipse乱码解决方法
    No resource found that matches the given name 'Theme.AppCompat.Light 的完美解决方案
    【转】使用 Eclipse 调试 Java 程序的 10 个技巧
  • 原文地址:https://www.cnblogs.com/a757956132/p/3892147.html
Copyright © 2011-2022 走看看