1. 程式人生 > >Spring程式設計式事務實現

Spring程式設計式事務實現

程式設計式事務概述

       所謂程式設計式事務指的是通過編碼方式實現事務,即類似於JDBC程式設計實現事務管理。

       Spring框架提供一致的事務抽象,因此對於JDBC還是JTA事務都是採用相同的API進行程式設計。

java程式碼:
  1. Connection conn = null;  
  2. UserTransaction tx = null;  
  3. try {  
  4.     tx = getUserTransaction();                       //1.獲取事務
  5.     tx.begin();                                    //2.開啟JTA事務
  6.     conn = getDataSource().getConnection();           //3.獲取JDBC
  7.     //4.宣告SQL
  8.     String sql = "select * from INFORMATION_SCHEMA.SYSTEM_TABLES";  
  9.     PreparedStatement pstmt = conn.prepareStatement(sql);//5.預編譯SQL
  10.     ResultSet rs = pstmt.executeQuery();               //6.執行SQL
  11.     process(rs);                                   //7.處理結果集
  12.     closeResultSet(rs);                             //8.釋放結果集
  13.     tx.commit();                                  //7.提交事務
  14. catch (Exception e) {  
  15.     tx.rollback();                                 //8.回滾事務
  16.     throw e;  
  17. finally {  
  18.    conn.close();                                //關閉連線
  19. }  

       此處可以看到使用UserTransaction而不是Connection連線進行控制事務,從而對於JDBC事務和JTA事務是採用不同API進行程式設計控制的,並且JTA和JDBC事務管理的異常也是不一樣的。

       具體如何使用JTA程式設計進行事務管理請參考cn.javass.spring.chapter9包下的TranditionalTransactionTest類。

       而在Spring中將採用一致的事務抽象進行控制和一致的異常控制,即面向PlatformTransactionManager介面程式設計來控制事務。

 Spring對程式設計式事務的支援

Spring中的事務分為物理事務和邏輯事務;

  • 物理事務:就是底層資料庫提供的事務支援,如JDBC或JTA提供的事務;
  • 邏輯事務:是Spring管理的事務,不同於物理事務,邏輯事務提供更豐富的控制,而且如果想得到Spring事務管理的好處,必須使用邏輯事務,因此在Spring中如果沒特別強調一般就是邏輯事務;

邏輯事務即支援非常低級別的控制,也有高級別解決方案:

  • 低級別解決方案:

         工具類:使用工具類獲取連線(會話)和釋放連線(會話),如使用org.springframework.jdbc.datasource包中的ConnectionUtils類來獲取和釋放具有邏輯事務功能的連線。當然對整合第三方ORM框架也提供了類似的工具類,如對Hibernate提供了SessionFactoryUtils工具類,JPA的EntityManagerFactoryUtils等,其他工具類都是使用類似***Utils命名;

java程式碼:
  1. //獲取具有Spring事務(邏輯事務)管理功能的連線
  2. DataSourceUtils. getConnection(DataSource dataSource)  
  3. //釋放具有Spring事務(邏輯事務)管理功能的連線
  4. DataSourceUtils. releaseConnection(Connection con, DataSource dataSource)  

         TransactionAwareDataSourceProxy:使用該資料來源代理類包裝需要Spring事務管理支援的資料來源,該包裝類必須位於最外層,主要用於遺留專案中可能直接使用資料來源獲取連線和釋放連線支援或希望在Spring中進行混合使用各種持久化框架時使用,其內部實際使用ConnectionUtils工具類獲取和釋放真正連線;

java程式碼:
  1. <!--使用該方式包裝資料來源,必須在最外層,targetDataSource 知道目標資料來源-->  
  2. <bean id="dataSourceProxy"
  3. class="org.springframework.jdbc.datasource.  
  4. TransactionAwareDataSourceProxy">  
  5.     <property name="targetDataSource" ref="dataSource"/>  
  6. </bean>  

通過如上方式包裝資料來源後,可以在專案中使用物理事務編碼的方式來獲得邏輯事務的支援,即支援直接從DataSource獲取連線和釋放連線,且這些連線自動支援Spring邏輯事務;

  • 高級別解決方案:

         模板類:使用Spring提供的模板類,如JdbcTemplate、HibernateTemplate和JpaTemplate模板類等,而這些模板類內部其實是使用了低級別解決方案中的工具類來管理連線或會話;

Spring提供兩種程式設計式事務支援:直接使用PlatformTransactionManager實現和使用TransactionTemplate模板類,用於支援邏輯事務管理。

如果採用程式設計式事務推薦使用TransactionTemplate模板類和高級別解決方案。

使用PlatformTransactionManager

首先讓我們看下如何使用PlatformTransactionManager實現來進行事務管理:

1、資料來源定義,此處使用第7章的配置檔案,即“chapter7/ applicationContext-resources.xml”檔案。

2、事務管理器定義(chapter9/applicationContext-jdbc.xml):

java程式碼:
  1. <bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">    
  2.     <property name="dataSource" ref="dataSource"/>  
  3. </bean>  

3、 準備測試環境:

3.1、首先準備測試時使用的SQL:

java程式碼:
  1. package cn.javass.spring.chapter9;  
  2. //省略import
  3. publicclass TransactionTest {  
  4.     //id自增主鍵從0開始
  5.     privatestaticfinal String CREATE_TABLE_SQL = "create table test" +  
  6.     "(id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, " +  
  7.     "name varchar(100))";  
  8.     privatestaticfinal String DROP_TABLE_SQL = "drop table test";  
  9.     privatestaticfinal String INSERT_SQL = "insert into test(name) values(?)";  
  10.     privatestaticfinal String COUNT_SQL = "select count(*) from test";  
  11.     ……  
  12. }  

3.2、初始化Spring容器

java程式碼:
  1. package cn.javass.spring.chapter9;  
  2. //省略import
  3. publicclass TransactionTest {  
  4.     privatestatic ApplicationContext ctx;  
  5.     privatestatic PlatformTransactionManager txManager;  
  6.     privatestatic DataSource dataSource;  
  7.     privatestatic JdbcTemplate jdbcTemplate;  
  8.     ……  
  9.     @BeforeClass
  10.     publicstaticvoid setUpClass() {  
  11.         String[] configLocations = new String[] {  
  12.                 "classpath:chapter7/applicationContext-resources.xml",  
  13.                 "classpath:chapter9/applicationContext-jdbc.xml"};  
  14.         ctx = new ClassPathXmlApplicationContext(configLocations);  
  15.         txManager = ctx.getBean(PlatformTransactionManager.class);  
  16.         dataSource = ctx.getBean(DataSource.class);  
  17.         jdbcTemplate = new JdbcTemplate(dataSource);  
  18.     }   
  19.     ……  
  20. }  

3.3、使用高級別方案JdbcTemplate來進行事務管理器測試:

java程式碼:
  1. @Test
  2. publicvoid testPlatformTransactionManager() {  
  3.     DefaultTransactionDefinition def = new DefaultTransactionDefinition();  
  4.     def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);  
  5.     def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);  
  6.     TransactionStatus status = txManager.getTransaction(def);  
  7.     jdbcTemplate.execute(CREATE_TABLE_SQL);  
  8.     try {  
  9.         jdbcTemplate.update(INSERT_SQL, "test");  
  10.         txManager.commit(status);  
  11.     } catch (RuntimeException e) {  
  12.         txManager.rollback(status);  
  13.     }  
  14.     jdbcTemplate.execute(DROP_TABLE_SQL);  
  15. }  
  • DefaultTransactionDefinition:事務定義,定義如隔離級別、傳播行為等,即在本示例中隔離級別為ISOLATION_READ_COMMITTED(提交讀),傳播行為為PROPAGATION_REQUIRED(必須有事務支援,即如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,就加入到這個事務中)。
  • TransactionStatus:事務狀態類,通過PlatformTransactionManager的getTransaction方法根據事務定義獲取;獲取事務狀態後,Spring根據傳播行為來決定如何開啟事務;
  • JdbcTemplate:通過JdbcTemplate物件執行相應的SQL操作,且自動享受到事務支援,注意事務是執行緒繫結的,因此事務管理器可以執行在多執行緒環境;
  • txManager.commit(status):提交status物件繫結的事務;
  • txManager.rollback(status):當遇到異常時回滾status物件繫結的事務。

3.4、使用低級別解決方案來進行事務管理器測試:

java程式碼:
  1. @Test
  2. publicvoid testPlatformTransactionManagerForLowLevel1() {  
  3. DefaultTransactionDefinition def = new

    相關推薦

    Spring程式設計事務實現

    程式設計式事務概述        所謂程式設計式事務指的是通過編碼方式實現事務,即類似於JDBC程式設計實現事務管理。        Spring框架提供一致的事務抽象,因此對於JDBC還是JTA事務都是採用相同的API進行程式設計。 java程式碼

    Spring 程式設計事務 宣告事務

    程式設計式事務通用類: import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.datasource.DataSourceTransactionManager

    使用Spring程式設計事務TransactionTemplate

    使用場景 假如有一個專案設定了資料庫最大連線數為3,然後專案中提供了一個介面,介面中的一個方法會做以下邏輯處理:①首先在資料庫的某個表中查詢出一條記錄,②然後利用該條記錄的資料去調第三方的介面,然後第三方介面放回資料,③最後修改該條記錄的某個欄位的資料然後更新回資料庫。 假設有4個使

    spring 程式設計事務spring事務一)

    配置檔案 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org

    手寫Spring註解事務(利用AOP技術 + 註解 + Spring程式設計事務

    1.參考下面的文章搭建一個無事務管理的SSM操作資料庫的框架       Spring 使用Druid資料來源 整合 Mybatis 2.AOP技術參考       AOP技術應用實現 3.第一步首先實現Sprin

    spring系列】之14:spring宣告事務實現原理剖析

    通過上一節事務環境搭建,我們知道,在搭建的5個步驟中,有兩個是spring為我們提供底層去稍作配置,然後使用的, 這兩個操作涉及的便是: @EnableTransactionManagement PlatformTransactionManager 其中,Platfor

    Spring程式設計事務的使用

    引入事務管理器 @Autowired TransactionTemplate transactionTemplate; @Autowired PlatformTransactionManager

    Spring 程式設計事務和申明事務選擇和使用小結

    1.選擇程式設計式事務管理還是宣告式事務管理:    當你只有很少的事務操作時,程式設計式事務管理通常比較合適。例如,如果你有一個Web應用,其中只有特定的更新操作有事務要求,你可能不願使用Spring或其他技術設定事務代理。這種情況下,使用 TransactionTemp

    Spring程式設計事務管理和宣告事務管理 案例

           轉賬案例使用了Spring事務管理,用兩種方式實現:程式設計式事務管理和宣告式事物管理。    其中,程式設計式事務管理是一種手動修改程式碼的方式,比較麻煩,在開發過程中很少使用;宣告式事務管理有三種方法實現,分別是TransactionProxyFacto

    Spring程式設計事務管理

    在基於資料庫的應用中,事務是非常重要的。為了方便使用,Spring提供了基於XML和基於註解的方式配置事務,思路都是使用AOP,在特定的切入點統一開啟事務,以方法為粒度進行事務控制。並且定義了事務的傳播屬性,規定了配置了事務的方法互相巢狀呼叫時的行為準則: PROPAG

    Spring框架事務管理之四:Spring程式設計事務

    雖然Spring框架推薦使用宣告式事務管理,但是我們也要了解一下Spring的程式設計式事務。Spring程式設計式事務僅適用於操作簡單的事務,有兩種程式設計實現的方式:直接使用org.springframework.transaction.PlatformTransacti

    spring程式設計事務

    Spring (jdbc事務管理) Spring 實現程式設計式事務,依賴於2大類,分別是 DataSourceTransactionManager(事務管理器),與 TransactionTemplate(事務模板)。下面詳細介紹 Spring是如何通過該類

    Spring事務實現程式設計事務

    程式設計式事務(TranscationTemplate) 廢話不多說,直接看配置檔案。 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/sc

    用Java+xml配置方式實現Spring資料事務程式設計事務

    一、用Java配置的方式 1、實體類: Role  public class Role { private int id; private String roleName; private String note; @Override

    第十講:10.spring對事物的支援-程式設計事務管理

    轉賬業務 1,複製spring403-03 改名spring403:建立表結構,資料庫的引擎一定是InnoDB Create Table CREATE TABLE `t_account` (   

    淺談spring事務管理的2種方式:程式設計事務管理和宣告事務管理;以及@Transactional(rollbackFor=Exception.class)註解用法

    事務的概念,以及特性: 百度百科介紹: ->資料庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過

    8.spring事務管理(上):Spring的資料庫程式設計程式設計事務管理

    Spring的資料庫程式設計  Spring框架提供了JDBC模板模式------>JdbcTemplate 簡化了開發,在開發中並不經常是使用 實際開發更多使用的是Hibernate和MyBatis 1).Spring JDBCp配置 如果使用Spring JDBC操作資料庫,要有

    【第九章】 Spring事務 之 9.3 程式設計事務

    9.3.1  程式設計式事務概述         所謂程式設計式事務指的是通過編碼方式實現事務,即類似於JDBC程式設計實現事務管理。        Spring框架提供一致的事務抽象,因此對於JDBC還是JTA事務都是採用相同的API進行程式設計。 Connectio

    事務模板接入 spring程式設計事務

    事務模板接入 這裡接入的是spring的程式設計式事務,代理一下spring的TransactionTemplate就可以了。   import org.springframework.transaction.TransactionException; import&

    Spring的四種事務管理(一種程式設計事務+三種宣告事務

    Spring的4種事務管理(1種程式設計式事務+三種宣告事務) 一、Spring事務的介紹 二、程式設計式事務xml的配置 注入後直接在service層呼叫模板的方法使用 三、基於AOP方式的宣告式事務管理 prop的具體配置