1. 程式人生 > 實用技巧 >Spring 宣告式事務

Spring 宣告式事務

程式設計式事務:在業務程式碼中新增事務控制程式碼,這樣的事務控制機制就叫做程式設計式事務

宣告式事務:通過xml或者註解配置的⽅式達到事務控制的⽬的,叫做宣告式事務

事務的概念

  事務指邏輯上的⼀組操作,組成這組操作的各個單元,要麼全部成功,要麼全部不成功。從⽽確保了資料的準確與安全

事務的四大特性

  • 原子性(Atomicity)原⼦性是指事務是⼀個不可分割的⼯作單位,事務中的操作要麼都發⽣,要麼都不發⽣。從操作的⻆度來描述
  • ⼀致性(Consistency)事務必須使資料庫從⼀個⼀致性狀態變換到另外⼀個⼀致性狀態。⼀致性是從資料的⻆度來說的
  • 隔離性(Isolation) 事務的隔離性是多個⽤戶併發訪問資料庫時,資料庫為每⼀個⽤戶開啟的事務,每個事務不能被其他事務的操作資料所⼲擾,多個併發事務之間要相互隔離
  • 永續性(Durability)永續性是指⼀個事務⼀旦被提交,它對資料庫中資料的改變就是永久性的,接下來即使資料庫發⽣故障也不應該對其有任何影響

事務的隔離級別

  不考慮隔離級別,會出現以下情況:(以下情況全是錯誤的),也即為隔離級別在解決事務併發問題
  • 髒讀:⼀個執行緒中的事務讀到了另外⼀個執行緒中未提交的資料。
  • 不可重複讀:⼀個執行緒中的事務讀到了另外⼀個執行緒中已經提交的update的資料(前後內容不⼀樣)
  • 虛讀(幻讀):⼀個執行緒中的事務讀到了另外⼀個執行緒中已經提交的insert或者delete的資料(前後條數不⼀樣)
資料庫定義了四種隔離級別:
  • Serializable(串⾏化):可避免髒讀、不可重複讀、虛讀情況的發⽣。  (串⾏化) 最⾼
  • Repeatable read(可重複讀):可避免髒讀、不可重複讀情況的發⽣,該機制下會對要update的⾏進⾏加鎖。 (幻讀有可能發⽣) 第⼆
  • Read committed(讀已提交):可避免髒讀情況發⽣。不可重複讀和幻讀⼀定會發⽣。 第三
  • Read uncommitted(讀未提交):最低級別,以上情況均⽆法保證。 (讀未提交) 最低
注意:級別依次升高,效率依次降低 MySQL的預設隔離界別是:REPEATABLE READ 查詢當前使用的隔離級別:select @@tx_isolation; 設定MySQL事務的隔離級別:set session transaction isolation level xxx; (設定的是當前mysql連線的會話,並不是永久改變的)

事務的傳播行為

  事務一般在service層進⾏控制,如果出現service層⽅法A調⽤了另外⼀個service層⽅法B,A和B⽅法本身都已經被添加了事務控制,那麼A調⽤B的時候,就需要進⾏事務的⼀些協商,這就叫做事務的傳播⾏為 下表為spring的事務傳播行為:加粗為常用的
PROPAGATION_REQUIRED 如果當前沒有事務,就新建⼀個事務,如果已經存在⼀個事務中,加⼊到這個事務中。這是最常⻅的選擇
PROPAGATION_SUPPORTS ⽀持當前事務,如果當前沒有事務,就以⾮事務⽅式執⾏
PROPAGATION_MANDATORY 使⽤當前的事務,如果當前沒有事務,就丟擲異常
PROPAGATION_REQUIRES_NEW 新建事務,如果當前存在事務,把當前事務掛起
PROPAGATION_NOT_SUPPORTED 以⾮事務⽅式執⾏操作,如果當前存在事務,就把當前事務掛起
PROPAGATION_NEVER 以⾮事務⽅式執⾏,如果當前存在事務,則丟擲異常
PROPAGATION_NESTED 如果當前存在事務,則在巢狀事務內執⾏。如果當前沒有事務,則執⾏與PROPAGATION_REQUIRED類似的操作

Spring 中事務的API

public interface PlatformTransactionManager {

    /**
     * 獲取事務狀態資訊
     */
    TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
            throws TransactionException;

    /**
     * 提交事務
     */
    void commit(TransactionStatus status) throws TransactionException;

    /**
     * 回滾事務
     */
    void rollback(TransactionStatus status) throws TransactionException;

}

作用:

  此接⼝是Spring的事務管理器核⼼接⼝。Spring本身並不⽀持事務實現,只是負責提供標準,應⽤底層⽀持什麼樣的事務,需要提供具體實現類。此處也是策略模式的具體應⽤。在Spring框架中,也為我們內建了⼀些具體策略,例如:DataSourceTransactionManager , HibernateTransactionManager 等