事務的四種隔離級別和七種傳播行爲
要想在 Spring 中使用事務, 就需要先了解事務
- 什麼是事務?
-
事務 (TRANSACTION) 是作爲單個邏輯工作單元執行的一系列操作。
-
多個操作作爲一個整體向系統提交,要麼都執行,要麼都不執行。
-
事務是一個不可分割的邏輯單元。
- 事務的特性 (ACID)
-
原子性(Atomicity) 原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
-
一致性(Consistency) 事務前後數據的完整性必須保持一致。
-
隔離性(Isolation) 事務的隔離性是多個用戶併發訪問數據庫時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作數據所幹擾,多個併發事務之間要相互隔離。
-
持久性(Durability) 持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響
3. 什麼是髒讀, 不可重複讀, 幻讀?
-
髒讀: 簡單來說, 就是一個事務讀取到了另一個事務未提交的數據。
-
不可重複讀: 就是說, 比如在 A 事務中進行多次相同的查詢, B 事務在 A 事務多次查詢之間修改對應表中的數據, 導致 A 事務多次讀取的結果不一致。
-
幻讀: 舉例來說, 就是 A 事務將表中'性別'列的值都更改爲 1,B 事務在 A 事務修改之後又添加了一條記錄, 而'性別'的值爲 0, 回過來 A 再查詢所以的記錄時會發現有一條記錄的'性別'爲 0, 這種情況就是所謂的幻讀
- 事務的四種隔離級別
-
ISOLATION_READ_UNCOMMITTED: 讀未提交
-
ISOLATION_READ_COMMITTED: 讀已提交
-
ISOLATION_REPEATABLE_READ: 可重複讀
-
ISOLATION_SERIALIZABLE: 串行化
- 四種隔離可以解決的問題
- 事務的七種傳播行爲
什麼是事務的傳播行爲: 事務傳播行爲用來描述由某一個事務傳播行爲修飾的方法被嵌套進另一個方法的時事務如何傳播。
-
**PROPAGATION_REQUIRED **表示當前方法必須在一個具有事務的 上下文中運行, 如有客戶端有事務在進行,那麼被調用端將在該事務中運行,否則的話重新開啓一個事務。( 如果被調用端發生異常, 那
麼調用端和被調用端事務都將回滾)
-
**PROPAGATION_SUPPORTS **表示當前方法不必需要具有一個事務 上下文, 但是如果有一個事務的話, 它也可以在這個事務中運行
-
PROPAGATION_MANDATORY 表示當前方法必須在一個事務中運行,如果沒有事務,將拋出異常
-
**PROPAGATION_REQUIRES_NEW **總是開啓一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。
-
PROPAGATION_NOT_SUPPORTED 總是非事務地執行,並掛起任何存在的事務。
-
PROPAGATION_NEVER 總是非事務地執行,如果存在一個活動事務,則拋出異常
-
PROPAGATION_NESTED 表示如果當前方法正有一個事務在運行中, 則該方法應該運行在一個嵌套事務中 , 被嵌__套的事務可以獨立於被封裝的事務中進行提交或者回滾。如果封裝事務存在, 並且外層__事務拋出異常回滾,那麼內層事務必須回滾, 反之, 內層事務並不影響外層事務。如果__封裝事務不存在, 則同 propagation. required 的一樣
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/eV9ClpLTUf75RcuRc0zrRA