1. 程式人生 > >spring事務操作

spring事務操作

一、jdbcTemplate  

      什麼是JdbcTemplate?

            spring提供用於操作資料庫模版,類似Dbutils,通俗點講,我們操作資料庫,spring也會幫我們提供一個操作資料庫的工具供我們使用,而不用我們自己手動編寫連線資料庫,獲取結果集等等操作,這個工具就是JdbcTemplate。跟Dbutils一樣,想要使用JdbcTemplate,就必須給他配置資料來源。

      第一步:導包

              

      第二步:配置資料來源,配置模版,給UserDao配置模版

          使用dbcp充當資料來源

              

          使用c3p0充當資料來源

              

      第三步:UserDao中使用JdbcTemplate

              

          但是spring為了讓我們更方便,不用每次都寫set方法和JdbcTemplate屬性,給我們提供了一個類JdbcDaoSupport,我們只需要繼承他,就可以直接獲得jdbcTemplate了,因為JdbcDaoSupport中幫我們寫了set方法

              

       第四步:使用JdbcTemplate API操作資料庫

               update 進行 增刪改操作

               queryForObject  查詢一個

               query  查詢所有

               queryForInt 查詢一個整形(分頁)

              

        第五步,測試 成功插入資料,其他的就不測了。

                    

 

        提升:使用properties 

              將連線資料的具體引數配合到properties檔案,由spring載入properties,並在spring配置檔案中使用  

              

 

二、事務的回顧

      如果一點都不清楚,看這篇博文,詳細講解了事務http://www.cnblogs.com/whgk/p/6182742.html

      事務:一組業務操作,要麼全部成功,要麼全部失敗

      特性:ACID

          A:原子性,是說事務是一個整體,要麼全部成功,要麼全部失敗

          C:一致性,資料完整,你轉100給我,你減100,我要增加100

          I:隔離性,併發(多個事務)

          D:永續性,已經提交的事務,就已經儲存到資料庫中,不能在改變了

      隔離問題:

          髒讀:讀取到未提交的資料

          不可重複讀:讀取到已經提交的資料(update)

          虛度(幻讀):讀取到已經提交的資料(insert)

      解決隔離問題

          讀未提交:存在三個問題。

          讀已提交:存在兩個問題,解決髒讀問題(Oracle預設級別)

          可重複讀:存在一個問題,解決髒讀,不可重複讀問題(Mysql預設級別)

          序列化:解決所有問題。

      而我們普通的程式要想使用事務的話,通過連線Connection來開啟事務和關閉事務或者回滾,

              

 

三、spring如何進行事務的管理的理論分析

     PlatformTransactionManager:事務平臺管理器。

           spring管理事務時,必須使用平臺事務管理器,它是一個介面,相當於定義一個spring使用事務的規範,也就是如果你想用spring來幫你管理事務,那麼就必須遵循這個規範,spring也幫我們實現了一些常用的技術所需要的管理器,比如,jdbc有jdbc管理器,hibernate有hibernate管理器,他們都是實現spring中的PlatformTransactionManager介面的。

              

          jdbc事務管理器:DataSourceTransactionManager

          hibernate事務管理器:HibernateTransactionManager

      PlatformTransactionManager是一個介面,那我們看它定義了哪些方法供我們使用的。

                  

         TransactionStatus getTransaction(TransactionDefinition);

                獲取事務,引數TransactionDefinition(事務詳情),該引數是需要我們配置的,通過我們配置的內容才能知道事務如何去處理。這個下面會詳解

         commit(TransactionStatus);

                根據狀態來提交事務的操作

         rollback(TransactionStatus);

                根據狀態來回滾事務的操作

 

      TransactionStatus

          spring使用管理器,通過狀態對事務進行管理(操作),我們不必關心這個,因為這是spring內部操作的事情,但是我們可以瞭解一下有哪些方法

              

      TransactionDefinition

           spring管理器必須通過"事務詳情"的設定,獲取相應的事務,從而進行事務管理。這裡這個很重要,我們需要配置這個

               

           設定4個隔離級別就不用說了把,跟上面我們說的是一樣的。解決隔離問題的四種級別。

           傳播行為:一個業務A,一個業務B,AB如何共享事務,不同傳播行為共享方案不同。 

                什麼意思呢?比如業務A為銀行轉賬的業務。 業務B為轉完賬發簡訊的業務,平常我們是轉完錢,那麼我們就需要收到簡訊說我們的賬戶上被轉走多少錢,而收錢的那一方則需要收到簡訊說賬戶被轉進多少錢,那麼這兩個業務是使用同一個事務呢?還是分別使用不同的事務,也就是如果是使用同一個事務的話,我們轉錢成功了代表業務A成功了,但是業務B傳送簡訊時出現問題,則說明該事務失敗,那麼剛才轉的錢就算不成功,需要回滾,但是實際生活中,是不能這樣的,轉錢成功了,簡訊沒傳送成功,那麼簡訊在重新發送一次即可。不需要讓業務A重新在操作一遍。這就是業務A和業務B共享事務的解決方法,讓他們兩個使用各自的事務。而傳播行為就是提供這樣的共享方案的屬性。

           傳播行為方案               

                1.PROPAGATION_REQUIRED ,required ,必須使用事務  (預設值)

                         A 如果使用事務,B 使用同一個事務。(支援當前事務)

                         A 如果沒有事務,B將建立一個新事務。

                2.PROPAGATION_SUPPORTS,supports ,支援事務

                         A 如果使用事務,B 使用同一個事務。(支援當前事務)

                         A 如果沒有事務,B 將以非事務執行。

                3.PROPAGATION_MANDATORY,mandatory 強制

                         A 如果使用事務,B 使用同一個事務。(支援當前事務)

                         A 如果沒有事務,B 拋異常

                4.PROPAGATION_REQUIRES_NEW , requires_new ,必須是新事務

                         A 如果使用事務,B將A的事務掛起,再建立新的。

                         A 如果沒有事務,B將建立一個新事務  

                5.PROPAGATION_NOT_SUPPORTED ,not_supported 不支援事務

                         A 如果使用事務,B將A的事務掛起,以非事務執行

                         A 如果沒有事務,B 以非事務執行

                6.PROPAGATION_NEVER,never 從不使用

                         A 如果使用事務,B 拋異常

                         A 如果沒有事務,B 以非事務執行 

                7.PROPAGATION_NESTED nested 巢狀

                         A 如果使用事務,B將採用巢狀事務。

                         巢狀事務底層使用Savepoint 設定儲存點,將一個事務,相當於拆分多個。比如業務A為AB兩個曹祖,業務B為CD兩個操作,業務AB使用同一個事務,在AB (POINT) CD,當業務B失敗時,回滾到POINT處,從而業務A還是成功的,就是保持點的操作。

                         底層使用巢狀try方式

   

                掌握:PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEWPROPAGATION_NESTED

         總結:

                spring事務程式設計的步驟

                1、確定管理器

                2、必須配置事務詳情(是否只讀,隔離級別,傳播行為等)

              配置好了事務詳情,也確定了使用哪個管理器,那麼spring就知道如何對事務進行怎樣的處理了。

 

 

四、spring使用AOP技術來進行事務操作(基於xml)

        上面我們知道了spring使用事務需要哪些東西,但是單純的使用上面這些編寫事務,那我們對每個需要使用事務的方法都需要寫程式碼,豈不是累死,但是結合前面學習的AOP思想,就簡單很多了。

        重點看配置

              

        

 

        重點看47到59行的程式碼,配置事務管理器和事務詳情,然後通過aop將我們的事務應用到指定的切入點上去,使用的是表示式。指定一個範圍。其中,事務詳情和事務管理器的結合就相當於通知(加強的方法),所以菜在通知引用上可以寫上exAdvice。這點必須想清楚。也就是我們都不需要自己手動寫什麼開啟事務等程式碼,spring全幫我們寫好了,我們只需要配置一下事務詳情即可。

        需要注意一點,因為使用的是spring內建的aop,沒有使用AspectJ框架,所以如果沒有使用介面,那麼就需要寫56行這行程式碼,如果使用了介面,那麼就不需要寫。需要通知spring使用cjlib代理

        事務詳情的配置

              

          這樣設定的話,就可以對不同的方法進行不同的事務處理了,很方便。比如add*,意思是add開頭的方法,就使用傳播行為為REQUIRED的事務進行處理,而find*,find開頭的方法只能讀,並且傳播行為為REQUIRED。

 

五、spring使用AOP技術來進行事務操作(基於註解)

        超級簡單。三步

        1、宣告事務管理器

        2、將事務管理器交予spring

          前兩步是在xml中寫的

            

        3、在目標類或方法上 使用註解即可 @Transactional

            使用@Transactional(編寫事務詳情)

            

 

六、總結

      上面所寫的aop的是使用spring預設的aop,並沒有使用AspectJ框架,要區分清楚。並且今天這篇講的是使用aop對事務進行管理。其實也就是通過aop對指定的方法進行加強,而加強的內容就是事務的內容,而事務的內容也是由spring幫我們做的,也就是通知也是spring幫我們寫的,我們只需要通過配置事務管理器和事務詳情即可。而前面一篇,所有的通知都是我們自己手動編寫的,為的是體驗aop的那種思想,這是不一樣的。所以不要把自己給搞混了。

轉載:http://www.cnblogs.com/whgk/p/6638192.html