Spring 宣告式事務
阿新 • • 發佈:2020-08-01
程式設計式事務:在業務程式碼中新增事務控制程式碼,這樣的事務控制機制就叫做程式設計式事務
宣告式事務:通過xml或者註解配置的⽅式達到事務控制的⽬的,叫做宣告式事務
事務的概念
事務指邏輯上的⼀組操作,組成這組操作的各個單元,要麼全部成功,要麼全部不成功。從⽽確保了資料的準確與安全
事務的四大特性
- 原子性(Atomicity)原⼦性是指事務是⼀個不可分割的⼯作單位,事務中的操作要麼都發⽣,要麼都不發⽣。從操作的⻆度來描述
- ⼀致性(Consistency)事務必須使資料庫從⼀個⼀致性狀態變換到另外⼀個⼀致性狀態。⼀致性是從資料的⻆度來說的
- 隔離性(Isolation) 事務的隔離性是多個⽤戶併發訪問資料庫時,資料庫為每⼀個⽤戶開啟的事務,每個事務不能被其他事務的操作資料所⼲擾,多個併發事務之間要相互隔離
- 永續性(Durability)永續性是指⼀個事務⼀旦被提交,它對資料庫中資料的改變就是永久性的,接下來即使資料庫發⽣故障也不應該對其有任何影響
事務的隔離級別
不考慮隔離級別,會出現以下情況:(以下情況全是錯誤的),也即為隔離級別在解決事務併發問題- 髒讀:⼀個執行緒中的事務讀到了另外⼀個執行緒中未提交的資料。
- 不可重複讀:⼀個執行緒中的事務讀到了另外⼀個執行緒中已經提交的update的資料(前後內容不⼀樣)
- 虛讀(幻讀):⼀個執行緒中的事務讀到了另外⼀個執行緒中已經提交的insert或者delete的資料(前後條數不⼀樣)
- Serializable(串⾏化):可避免髒讀、不可重複讀、虛讀情況的發⽣。 (串⾏化) 最⾼
- Repeatable read(可重複讀):可避免髒讀、不可重複讀情況的發⽣,該機制下會對要update的⾏進⾏加鎖。 (幻讀有可能發⽣) 第⼆
- Read committed(讀已提交):可避免髒讀情況發⽣。不可重複讀和幻讀⼀定會發⽣。 第三
- Read uncommitted(讀未提交):最低級別,以上情況均⽆法保證。 (讀未提交) 最低
事務的傳播行為
事務一般在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 等