隨筆 - 100  文章 - 50  trackbacks - 0
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          我收藏的一些文章!

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          Spring可以支持編程式事務和聲明式事務。

          Spring使用事務管理器,每個不同平臺的事務管理器都實現了接口:PlatformTransactionManager

          此接口是事務管理的核心,提供了三個需要實現的函數:

          1. commit(TransactionStatus status) ;     
          2. getTransaction(TransactionDefinition definition) ;     
          3. rollback(TransactionStatus status) ;  

           

          如果我們使用的是JDBC來處理事務,那么這個事務管理器就是DataSourceTransactionManager。

          通過Spring文檔查找到這個類,發現其需要DataSource這個類。也就是只要實現了javax.sql.DataSource這個接口的類,都可以作為參數傳入到DataSourceTransactionManager。

           然后,找到 包org.springframework.transaction.support中的 TransactionTemplate。

          發現TransactionTemplate中有一個重要的方法:

          1. execute(TransactionCallback action) ;  

           

          就是利用這個方法,我們可以在這個方法中添加事務。

          這個方法需要傳入參數 TransactionCallback。

          TransactionCallback,顧名思義,就是事務回調然后查到TransactionCallback。

          發現這是一個接口(這也必須是接口,因為任務都是自己具體定義的)

          里面只有一個方法:

          1. doInTransaction(TransactionStatus status) ;   

           

          很明顯,就是在一個事務中需要做的事情都包括這這個方法中了。

          而這個doInTransaction 又傳入了一個參數,這次是 TransactionStatus,繼續顧名思義,也就是事務狀態。

          查詢下去,這個 TransactionStatus 還是一個接口。 看看這個接口定義了哪些服務(方法):

          1. hasSavepoint() ;  
          2. isCompleted() ;    
          3. isNewTransaction() ;  
          4. setRollbackOnly() ;  

           

          當需要回滾的時候,需要在調用 setRoolbackOnly(); 就OK了。

          好了,走了這么久,現在就來簡單總結一下編程式事務管理。

          首先: 因為我們使用的是特定的平臺,所以,我們需要創建一個合適我們的平臺事務管理PlateformTransactionManager。如果使用的是JDBC的話,就用DataSourceTransactionManager。注意需要傳入一個DataSource,這樣,平臺才知道如何和數據庫打交道。

          第二: 為了使得平臺事務管理器對我們來說是透明的,就需要使用 TransactionTemplate。使用TransactionTemplat需要傳入一個 PlateformTransactionManager 進入,這樣,我們就得到了一個 TransactionTemplate,而不用關心到底使用的是什么平臺了。

          第三: TransactionTemplate 的重要方法就是 execute 方法,此方法就是調用 TransactionCallback 進行處理。

          也就是說,實際上我們需要處理的事情全部都是在 TransactionCallback 中編碼的。

          第四: 也就是 TransactionCallback 接口,我們可以定義一個類并實現此接口,然后作為 TransactionTemplate.execute 的參數。把需要完成的事情放到 doInTransaction中,并且傳入一個 TransactionStatus 參數。此參數是來調用回滾的。

          也就是說 ,PlateformTransactionManager 和 TransactionTemplate 只需在程序中定義一次,而TransactionCallback 和 TransactionStatus 就要針對不同的任務多次定義了。

          這就是Spring的編程式事務管理。下面貼出例子代碼:

          TemplateUtils

          1. import javax.naming.Context;  
          2. import javax.naming.InitialContext;  
          3. import javax.naming.NamingException;  
          4. import javax.sql.DataSource;  
          5.   
          6. import org.apache.log4j.Logger;  
          7. import org.springframework.jdbc.core.JdbcTemplate;  
          8. import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;  
          9. import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;  
          10. import org.springframework.jdbc.datasource.DataSourceTransactionManager;  
          11. import org.springframework.transaction.PlatformTransactionManager;  
          12. import org.springframework.transaction.support.TransactionTemplate;  
          13.   
          14. public class TemplateUtils {  
          15.     private static Logger logger = Logger.getLogger(TemplateUtils.class);  
          16.     private static String oracleDS = "<a href="http://lib.csdn.net/base/17" class='replace_word' title="Java EE知識庫" target='_blank' style='color:#df3434; font-weight:bold;'>Java</a>:OracleDS";  
          17.     private static DataSource dataSource = null;  
          18.   
          19.     static {  
          20.         try {  
          21.             Context context = new InitialContext();  
          22.             dataSource = (DataSource) context.lookup(oracleDS);  
          23.         } catch (NamingException e) {  
          24.             logger.info("查找數據源失敗···", e);  
          25.         }  
          26.     }  
          27.   
          28.     public static TransactionTemplate getTransactionTemplate() {  
          29.         PlatformTransactionManager txManager = new DataSourceTransactionManager(  
          30.                 dataSource);  
          31.         return new TransactionTemplate(txManager);  
          32.     }  
          33.   
          34.     public static JdbcTemplate getJdbcTemplate() {  
          35.         return new JdbcTemplate(dataSource);  
          36.     }  
          37.   
          38.     public static NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {  
          39.         return new NamedParameterJdbcTemplate(dataSource);  
          40.     }  
          41.   
          42.     public static SimpleJdbcTemplate getSimpleJdbcTemplate() {  
          43.         return new SimpleJdbcTemplate(dataSource);  
          44.     }  
          45.   
          46. }  

           

           

          Test

          1. import javax.naming.Context;  
          2. import javax.naming.InitialContext;  
          3. import javax.sql.DataSource;  
          4.   
          5. import org.springframework.jdbc.core.JdbcTemplate;  
          6. import org.springframework.jdbc.datasource.DataSourceTransactionManager;  
          7. import org.springframework.transaction.PlatformTransactionManager;  
          8. import org.springframework.transaction.TransactionStatus;  
          9. import org.springframework.transaction.support.DefaultTransactionDefinition;  
          10. import org.springframework.transaction.support.TransactionCallback;  
          11. import org.springframework.transaction.support.TransactionCallbackWithoutResult;  
          12. import org.springframework.transaction.support.TransactionTemplate;  
          13.   
          14. @SuppressWarnings("all")  
          15. public class Test {  
          16.   
          17.     public void m1() throws Exception {  
          18.         TransactionTemplate transactionTemplate = TemplateUtils  
          19.                 .getTransactionTemplate();  
          20.         Object object = transactionTemplate.execute(new TransactionCallback() {  
          21.             public Object doInTransaction(TransactionStatus status) {  
          22.                 try {  
          23.                     // 數據庫操作1  
          24.                     // 數據庫操作2  
          25.                 } catch (Exception e) {  
          26.                     status.setRollbackOnly();  
          27.                     e.printStackTrace();  
          28.                 }  
          29.                 return null;  
          30.             }  
          31.         });  
          32.     }  
          33.   
          34.     public void m2() throws Exception {  
          35.         TransactionTemplate transactionTemplate = TemplateUtils  
          36.                 .getTransactionTemplate();  
          37.         transactionTemplate.execute(new TransactionCallbackWithoutResult() {  
          38.             protected void doInTransactionWithoutResult(TransactionStatus s) {  
          39.                 try {  
          40.                     // 數據庫操作1  
          41.                     // 數據庫操作2  
          42.                 } catch (Exception e) {  
          43.                     s.setRollbackOnly();  
          44.                     e.printStackTrace();  
          45.                 }  
          46.             }  
          47.         });  
          48.     }  
          49.   
          50.     public void m3() throws Exception {  
          51.         Context ctx = new InitialContext();  
          52.         DataSource ds = (DataSource) ctx.lookup("java:OracleDS");  
          53.         JdbcTemplate jt = new JdbcTemplate(ds);  
          54.         DefaultTransactionDefinition tf = new DefaultTransactionDefinition();  
          55.         PlatformTransactionManager tm = new DataSourceTransactionManager(ds);  
          56.         TransactionStatus ts = tm.getTransaction(tf);  
          57.         try {  
          58.             // 數據庫操作1  
          59.             // 數據庫操作2  
          60.             tm.commit(ts);  
          61.         } catch (Exception e) {  
          62.             tm.rollback(ts);  
          63.             e.printStackTrace();  
          64.         }  
          65.     }  
          66.   
          67. }  

           

           

          JdbcUtils

          1. import java.sql.CallableStatement;  
          2. import java.sql.Connection;  
          3. import java.sql.PreparedStatement;  
          4. import java.sql.ResultSet;  
          5. import java.sql.SQLException;  
          6. import java.sql.Savepoint;  
          7.   
          8. import javax.naming.Context;  
          9. import javax.naming.InitialContext;  
          10. import javax.naming.NamingException;  
          11. import javax.sql.DataSource;  
          12.   
          13. import org.apache.log4j.Logger;  
          14.   
          15. public class JdbcUtils {  
          16.     private static Logger logger = Logger.getLogger(JdbcUtils.class);  
          17.     private static String oracleDS = "java:OracleDS";  
          18.     private static DataSource dataSource = null;  
          19.   
          20.     static {  
          21.         try {  
          22.             Context context = new InitialContext();  
          23.             dataSource = (DataSource) context.lookup(oracleDS);  
          24.         } catch (NamingException e) {  
          25.             logger.info("查找數據源失敗···", e);  
          26.         }  
          27.     }  
          28.   
          29.     public static Connection getConnection() {  
          30.         Connection conn = null;  
          31.         try {  
          32.             conn = dataSource.getConnection();  
          33.         } catch (SQLException e) {  
          34.             logger.info("獲取數據庫連接失敗···", e);  
          35.         }  
          36.         return conn;  
          37.     }  
          38.   
          39.     public static void close(Connection conn) {  
          40.         if (conn != null) {  
          41.             try {  
          42.                 conn.close();  
          43.             } catch (SQLException e) {  
          44.                 logger.info("釋放數據庫連接失敗···", e);  
          45.             }  
          46.         }  
          47.     }  
          48.   
          49.     public static void close(CallableStatement cs) {  
          50.         if (cs != null) {  
          51.             try {  
          52.                 cs.close();  
          53.             } catch (SQLException e) {  
          54.                 logger.info("關閉CallableStatement失敗···", e);  
          55.             }  
          56.         }  
          57.     }  
          58.   
          59.     public static void close(PreparedStatement ps) {  
          60.         if (ps != null) {  
          61.             try {  
          62.                 ps.close();  
          63.             } catch (SQLException e) {  
          64.                 logger.info("關閉PreparedStatement失敗···", e);  
          65.             }  
          66.         }  
          67.     }  
          68.   
          69.     public static void close(ResultSet rs) {  
          70.         if (rs != null) {  
          71.             try {  
          72.                 rs.close();  
          73.             } catch (SQLException e) {  
          74.                 logger.info("關閉ResultSet失敗···", e);  
          75.             }  
          76.         }  
          77.     }  
          78.   
          79.     public static void setAutoCommit(Connection conn, boolean autoCommit) {  
          80.         if (conn != null) {  
          81.             try {  
          82.                 conn.setAutoCommit(autoCommit);  
          83.             } catch (SQLException e) {  
          84.                 logger.info("設置事務提交方式失敗···", e);  
          85.             }  
          86.         }  
          87.     }  
          88.   
          89.     public static void commit(Connection conn) {  
          90.         if (conn != null) {  
          91.             try {  
          92.                 conn.commit();  
          93.             } catch (SQLException e) {  
          94.                 logger.info("提交事務失敗···", e);  
          95.             }  
          96.         }  
          97.     }  
          98.   
          99.     public static void rollback(Connection conn) {  
          100.         if (conn != null) {  
          101.             try {  
          102.                 conn.rollback();  
          103.             } catch (SQLException e) {  
          104.                 logger.info("回滾事務失敗···", e);  
          105.             }  
          106.         }  
          107.     }  
          108.   
          109.     public static void rollback(Connection conn, Savepoint sp) {  
          110.         if (conn != null) {  
          111.             try {  
          112.                 conn.rollback(sp);  
          113.             } catch (SQLException e) {  
          114.                 logger.info("回滾事務失敗···", e);  
          115.             }  
          116.         }  
          117.     }  
          118.   
          119. }  

           

          posted on 2016-06-16 09:55 fly 閱讀(1144) 評論(0)  編輯  收藏 所屬分類: java學習
          主站蜘蛛池模板: 行唐县| 东宁县| 嵩明县| 什邡市| 英山县| 满洲里市| 红安县| 横峰县| 伊川县| 岳西县| 景宁| 若尔盖县| 汕尾市| 江都市| 雅安市| 樟树市| 精河县| 襄城县| 丰原市| 克东县| 龙陵县| 崇文区| 百色市| 平顺县| 齐河县| 民勤县| 昌黎县| 高要市| 凤庆县| 白沙| 陵川县| 集安市| 富阳市| 吴江市| 城固县| 宝兴县| 嵊泗县| 叶城县| 鹰潭市| 密云县| 灌阳县|