《spring事務》

參考博客:https://blog.csdn.net/luanlouis/article/details/95319795

一 spring事務是什麼?有什麼用?

spring事務的作用是:處理業務中多個操作需要同時提交的編程模型。

spring的事務隔離和事務傳播機制則是事務需要解決的問題。

事務:單個邏輯單元內的一系列操作,要麼完全執行,要麼完全不執行。

spring事務在代碼層面用的是spring aop,底層用的是數據庫的事務。

對於純JDBC操作數據庫,想要用到事務,可以按照以下步驟進行:

  1. 獲取連接 Connection con = DriverManager.getConnection()
  2. 開啓事務con.setAutoCommit(true/false);
  3. 執行CRUD
  4. 提交事務/回滾事務 con.commit() / con.rollback();
  5. 關閉連接 conn.close();

二 事務特性

1 原子性:事務的原子性

2 一致性:中間狀態的不可見性

3 隔離性:一個事務不受其它事務影響

4 持久性:持久到數據庫

三 spring事務隔離級別

1 spring事務隔離解決的是數據的隔離性。

2 數據庫的隔離級別一般分爲四個級別,從隔離級別由高到低排序的話,分別是:SERIALIZABLE —> REPEATABLE READ—> READ_COMMITTED —>READ_UNCOMMITED,其分別表示如下幾種含義:

(1)SERIALIZABLE 序列化讀,隔離級別最高,客戶端以互斥的方式訪問數據庫資源,統一時間內,同一個資源只能被一個客戶端訪問,好像客戶端在排隊請求訪問,所以稱爲序列化讀。鎖全表,事務串行執行。
(2)REPEATABLE_READ 可重複讀,可重複讀能夠保證,一個客戶端在一個事務內,多次訪問同一個資源時,返回結果是一樣的,顧名思義,稱爲可重複讀,這種隔離級別可能會造成幻讀現象。鎖行,事務並行執行,A事務兩次查詢中B事務新增/刪除了數據,導致A事務兩次查詢的結果不一致,稱爲幻讀。(側重於數據增刪)
(3)READ_COMMITTED 讀已提交,即客戶端在一個事務內,每次查詢讀取的數據都是從數據庫讀取最新的已提交的數據;這種隔離界別可能會造成不可重複讀和幻讀現象。鎖行,事務並行執行,A事務兩次查詢中B事務修改了數據,導致A事務兩次查詢的結果不一致,稱爲不可重複讀。(側重於數據修改)
(4)READ_UNCOMMITTED 讀未提交,即客戶端在一個事務內,可以讀取到其他客戶端事務的尚未提交的數據;這種隔離級別可能會造成髒讀、不可重複讀、幻讀 現象。鎖行,事務併發執行,A事務讀B事務還未commit的數據,B事務後來進行了回滾,導致A事務讀到的數據是錯誤的數據。

四 spring事務傳播機制

1 spring事務傳播機制解決的是事務的嵌套調用

2 可分爲

(1)支持當前事務:

當前有事務,加入當前事務;如果當前沒有失誤,則創建新事務/以非事務執行/拋出異常

(2)不支持當前事務:

當前有事務,新建事務,掛起外部事務;以非事務運行,掛起外部事務;拋出異常。

(3)spring獨有的嵌套事務:外部事務的提交才能引起內部事務的提交

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章