首页 > 代码库 > Spring 的 @Transactional

Spring 的 @Transactional

Spring业务的传达行动 

在service类前加上@Transactional,声明这个service一切办法需求业务管理。每一个业务办法开始时都会翻开一个业务。 

Spring默许情况下会对运行期破例(RunTimeException)进行业务回滚。这个破例是unchecked 

假如遇到checked意外就不回滚。 

如何改动默许规矩: 

1 让checked破例也回滚:在整个办法前加上 @Transactional(rollbackFor=Exception.class) 

2 让unchecked破例不回滚: @Transactional http://www.metabase.cn (notRollbackFor=RunTimeException.class) 

3 不需求业务管理的(只查询的)办法:@Transactional(propagation=Propagation.NOT_SUPPORTED) 

在整个办法运行前就不会敞开业务 

       还能够加上:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true),这样就做成一个只读业务,能够提高效率。 

       各种特点的含义: 

       REQUIRED:业务办法需求在一个容器里运行。假如办法运行时,现已处在一个业务中,那么加入到这个业务,否则自个新建一个新的业务。 

       NOT_SUPPORTED:声明办法不需求业务。假如办法没有相关到一个业务,容器不会为他敞开业务,假如办法在一个业务中被调用,该业务会被挂起,调用完毕后,原先的业务会康复履行。 

       REQUIRESNEW:不论是否存在业务,该办法总汇为自个建议一个新的业务。假如办法现已运行在一个业务中,则原有业务挂起,新的业务被创立。 

       MANDATORY:该办法只能在一个现已存在的业务中履行,业务办法不能建议自个的业务。假如在没有业务的环境下被调用,容器抛出破例。 

       SUPPORTS:该办法在某个业务规模内被调用,则办法变成该业务的一部分。假如办法在该业务规模外被调用,该办法就在没有业务的环境下履行。 

       NEVER:该办法绝对不能在业务规模内履行。假如在就抛破例。只有该办法没有相关就任何业务,才正常履行。 

       NESTED:假如一个活动的业务存在,则运行在一个嵌套的业务中。假如没有活动业务,则按REQUIRED特点履行。它使用了一个独自的业务,这个业务具有多个能够回滚的保留点。内部业务的回滚不会对外部业务形成影响。它只对DataSourceTransactionManager业务管理器起效。 

业务圈套-1 

清单 1. 使用 JDBC 的简略数据库刺进 

view plaincopy to clipboardprint? 

@Stateless 

public class TradingServiceImpl implements TradingService {   

   @Resource SessionContext ctx;  //  http://www.metabase.cn 

   @Resource(mappedName="java:jdbc/tradingDS") DataSource ds;   

   public long insertTrade(TradeData trade) throws Exception {   

      Connection dbConnection = ds.getConnection();   

      try {   

         Statement sql = dbConnection.createStatement();   

         String stmt =   

            "INSERT INTO TRADE (ACCT_ID, SIDE, SYMBOL, SHARES, PRICE, STATE)" 

          + "VALUES (" 

          + trade.getAcct() + "‘,‘" 

          + trade.getAction() + "‘,‘" 

          + trade.getSymbol() + "‘," 

          + trade.getShares() + "," 

          + trade.getPrice() + ",‘" 

          + trade.getState() + "‘)";   

         sql.executeUpdate(stmt, Statement.RETURN_GENERATED_KEYS);   

         ResultSet rs = sql.getGeneratedKeys();   

         if (rs.next()) {   

            return rs.getBigDecimal(1).longValue();   

         } else {   

            throw new Exception("Trade Order Insert Failed");   

         }   

      } finally {   

         if (dbConnection != null) dbConnection.close();   

      }   

   }