久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    Spring的事務管理入門:編程式事務管理(TransactionTemplate)

     liang1234_ 2019-02-25

    轉載:http://blog.csdn.net/zq9017197/article/details/6321391

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

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

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

    [java] view plain copy
    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中有一個重要的方法:

    [java] view plain copy
    1. execute(TransactionCallback action) ;  

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

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

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

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

    里面只有一個方法:

    [java] view plain copy
    1. doInTransaction(TransactionStatus status) ;   

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

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

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

    [java] view plain copy
    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

    [java] view plain copy
    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 = "java: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

    [java] view plain copy
    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

    [java] view plain copy
    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. }  

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 无码囯产精品一区二区免费| 最近2019中文字幕大全视频1| 亚洲精品午夜国产VA久久成人| 日韩免费无码一区二区视频| 国产按头口爆吞精在线视频| 无码人妻蜜肉动漫中文字幕| 免费A级毛片樱桃视频| 久久精品国产亚洲AV嫖农村妇女| 日韩亚洲精品中文字幕| 精品久久久久久无码专区| 国产一区日韩二区三区| 久久精品国产久精国产一老狼| 国产精品普通话国语对白露脸| 无码人妻一区二区三区四区AV| 麻豆一区二区中文字幕| 色8久久人人97超碰香蕉987| 国产中文三级全黄| 亚洲熟妇AV一区二区三区宅男| 天堂亚洲免费视频| 人人妻人人澡人人爽人人DVD| 乱码精品一区二区三区| 欧美丰满熟妇bbbbbb| 国产微拍精品一区二区| 翘臀少妇被扒开屁股日出水爆乳| 中文字幕AV无码人妻| 欧美黑人又粗又大又硬免费视频| 在线a级毛片无码免费真人| 老熟妇乱子交视频一区| 欧美成人一卡二卡三卡四卡| 99久久精品国产一区二区蜜芽| 永久免费AV无码国产网站| 草裙社区精品视频播放| 四虎在线播放亚洲成人| 欧美亚洲一区二区三区| 四虎亚洲精品高清在线观看| 在线视频中文字幕二区| 亚洲国产成人影院播放| 午夜三级A三级三点在线观看| 国产精品自在拍首页视频| 亚洲成人四虎在线播放| 亚洲人成无码网站18禁|