Spring的事務隔離級別和傳播機制

2021-08-19 20:26:38 字數 1824 閱讀 4816

事務的acid:

1.原子性(atomictiy):事務開始後所有操作 要麼全部做完 要麼全部不做 不可能停滯在中間環節

2.一致性(consistency):事務開始前和結束後 資料庫的完整性約束沒有被破壞  比如a向b轉賬 不可能a扣了錢 b卻沒收到

3.隔離性(isolation):同一時間 只允許乙個事務請求同一資料 不同的事務之間彼此沒有任何干擾 比如a正在從一張銀行卡中取錢 在a取錢的過程結束前 b不能向這張卡轉賬

4.永續性(durability):事務完成後 事務對資料庫的所有更新將被儲存到資料庫 不能回滾

事務併發產生的問題:

1、髒讀:事務a讀取了事務b更新的資料 然後b回滾操作 那麼a讀取到的資料是髒資料

2、不可重複讀(多次讀取的資料不同):事務 a 多次讀取同一資料 事務 b 在事務a多次讀取的過程中 對資料作了更新(修改)並提交 導致事務a多次讀取同一資料時 結果不一致

3、幻讀:系統管理員a將資料庫中所有學生的成績從具體分數改為abcde等級 但是系統管理員b就在這個時候插入了一條具體分數的記錄 當系統管理員a改結束後發現還有一條記錄沒有改過來 就好像發生了幻覺一樣

不可重複讀的和幻讀很容易混淆 不可重複讀側重於修改 幻讀側重於新增或刪除 

解決不可重複讀的問題只需鎖住滿足條件的行 解決幻讀需要鎖表

* static int isolation_default  -- 採用資料庫的預設隔離級別

* static int isolation_read_uncommitted  -- 允許讀取尚未提交的修改 可能導致髒讀 幻讀和不可重複讀

* static int isolation_read_committed  -- 允許從已經提交的事務讀取 可防止髒讀 但幻讀 不可重複讀仍然有可能發生

* static int isolation_repeatable_read  -- 對相同欄位的多次讀取的結果是一致的 除非資料被當前事務自動修改 可防止髒讀和不可重複讀 但幻讀仍有可能發生

* static int isolation_serializable  -- 完全服從acid隔離原則確保不發生髒讀、不可重複讀、和幻讀 但執行效率最低

傳播機制:

* 先解釋什麼是事務的傳播行為:解決的是業務層之間的方法呼叫!!

* propagation_required(預設值)-- a中有事務,使用a中的事務.如果沒有 b就會開啟乙個新的事務 將a包含進來 (保證a b在同乙個事務中) 

* propagation_supports -- a中有事務 使用a中的事務 如果a中沒有事務 那麼b也不使用事務

* propagation_mandatory -- a中有事務 使用a中的事務 如果a沒有事務 丟擲異常

* propagation_requires_new -- a中有事務 將a中的事務掛起 b建立乙個新的事務 (保證a,b沒有在乙個事務中)

* propagation_not_supported -- a中有事務 將a中的事務掛起

* propagation_never -- a中有事務 丟擲異常

* propagation_nested -- 巢狀事務 當a執行之後 就會在這個位置設定乙個儲存點 如果b沒有問題 執行通過 如果b出現異常執行客戶根據需求回滾(選擇回滾到儲存點或者是最初始狀態)

spring事務隔離級別

在spring中定義了5中不同的事務隔離級別 1.isolation default 一般情況下使用這種配置既可 這是乙個platfromtransactionmanager預設的隔離級別,使用資料庫預設的事務隔離級別。2.isolation read uncommitted 4 p l.i f k...

Spring 事務隔離級別

資料庫事務的隔離級別有4種,由低到高分為為read uncomitted,read comitted,repeatable read serializable,而且,在事務的併發操作中可能會出現髒讀,不可重複度,虛讀 幻讀 髒讀 read uncomitted 什麼都防不住 乙個事務讀到另外乙個事務...

Spring事務隔離級別

事務操作可能出現的問題 更新丟失 lost update 當系統允許兩個事務同時更新同一資料時,發生更新丟失。髒讀 dirty read 當乙個事務讀取另乙個事務尚未提交的修改時,產生髒讀。非重複讀 nonrepeatable read 第一次讀 得到乙個結果 再讀,換了乙個結果 幻像 phanto...