事務介紹和常見的隔離級別,傳播行為

2021-10-05 15:19:10 字數 3809 閱讀 2220

事務(transaction)是由一系列對系統中資料進行訪問與更新的操作所組成的乙個程式執行邏輯單元。 事務具有4個基本特徵,分別是:原子性(atomicity)、一致性(consistency)、隔離性(isolation)、永續性(duration),簡稱acid。

事務指邏輯上的一組操作,組成這組操作的各個單元,要不全部成功,要不全部不成功

mysql 事務主要用於處理操作量大,複雜度高的資料。比如說,在人員管理系統中,你刪除乙個人員,你既需要刪除人員的基本資料,也要刪除和該人員相關的資訊,如信箱,文章等等,這樣,這些資料庫操作語句就構成乙個事務!

2、直接用 set 來改變 mysql 的自動提交模式:

1、原子性(atomicity)

原子性是指事務是乙個不可分割的工作單位,事務中的操作要麼全部成功,要麼全部失敗。乙個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。

2、一致性(consistency)

官網上事務一致性的概念是:事務必須使資料庫從乙個一致性狀態變換到另外乙個一致性狀態。以轉賬為例子,a向b轉賬,假設轉賬之前這兩個使用者的錢加起來總共是2000,那麼a向b轉賬之後,不管這兩個賬戶怎麼轉,a使用者的錢和b使用者的錢加起來的總額還是2000,這個就是事務的一致性。

3、隔離性(isolation)

事務的隔離性是多個使用者併發訪問資料庫時,資料庫為每乙個使用者開啟的事務,不能被其他事務的運算元據所干擾,多個併發事務之間要相互隔離。資料庫允許多個併發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致資料的不一致。事務隔離分為不同級別,包括讀未提交(read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和序列化(serializable)。

4、永續性(durability)

永續性是指乙個事務一旦被提交,它對資料庫中資料的改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響

事務的四大特性中最麻煩的是隔離性,下面重點介紹一下事務的隔離級別

1. 讀未提交(read_uncommitted)

讀未提交,該隔離級別允許髒讀取,其隔離級別是最低的。換句話說,如果乙個事務正在處理某一資料,並對其進行了更新,但同時尚未完成事務,因此還沒有提交事務;而以此同時,允許另乙個事務也能夠訪問該資料。

髒讀示例:

在事務a和事務b同時執行時可能會出現如下場景:

時間事務a(存款)

事務b(取款)

t1開始事務

——t2

——開始事務

t3——

查詢餘額(1000元)

t4——

取出1000元(餘額0元)

t5查詢餘額(0元)

——t6

——撤銷事務(餘額恢復1000元)

t7存入500元(餘額500元)

——t8

提交事務

——餘額應該為1500元才對。請看t5時間點,事務a此時查詢的餘額為0,這個資料就是髒資料,他是事務b造成的,很明顯是事務沒有進行隔離造成的。

2. 讀已提交(read_committed)

讀已提交是不同的時候執行的時候只能獲取到已經提交的資料。

這樣就不會出現上面的髒讀的情況了。

不可重複讀示例

可是解決了髒讀問題,但是還是解決不了可重複讀問題。

時間事務a(存款)

事務b(取款)

t1開始事務

——t2

——開始事務

t3——

查詢餘額(1000元)

t4查詢餘額(1000元)

——t5

——取出1000元(餘額0元)

t6——

提交事務

t7查詢餘額(0元)

——t8

提交事務

——事務a其實除了查詢兩次以外,其它什麼事情都沒做,結果錢就從1000程式設計0了,這就是不可重複讀的問題。

3. 可重複讀(repeatable_read)

可重複讀就是保證在事務處理過程中,多次讀取同乙個資料時,該資料的值和事務開始時刻是一致的。因此該事務級別進製了不可重複讀取和髒讀,但是有可能出現幻讀的資料。

幻讀幻讀就是指同樣的事務操作,在前後兩個時間段內執行對同乙個資料項的讀取,可能出現不一致的結果。

時間事務a(統計總存款)

事務b(存款)

t1開始事務

——t2

——開始事務

t3統計總存款(1000元)

——t4

——存入100元

t5——

提交事務

t6提交總存款(10100)

——t7

提交事務

——銀行工作人員在乙個事務中多次統計總存款時看到結果不一樣。如果要解決幻讀,那只能使用順序讀了。

4. 順序讀(serializable)

順序讀是最嚴格的事務隔離級別。它要求所有的事務排隊順序執行,即事務只能乙個接乙個地處理,不能併發。

事務隔離級別對比

事務隔離級別

髒 讀不可重複讀

幻 讀讀未提及(read_uncommitted)

允許允許

允許讀已提交(read_committed)

禁止允許

允許可重複讀(repeatable_read)

禁止禁止

允許順序讀(serializable)

禁止禁止

禁止

4種事務隔離級別從上往下,級別越高,併發性越差,安全性就越來越高。

一般資料預設級別是讀以提交或可重複讀。

多個執行緒開啟各自事務運算元據庫中資料時,資料庫系統要負責隔離操作,以保證各個執行緒在獲取資料時的準確性。

mysql資料庫共定義了四種隔離級別 隔離級別

場景的隔離級別

serializable(序列化)

最嚴格,序列處理,消耗資源大。可避免髒讀、不可重複讀、虛讀情況的發生。

repeatable read(可重複讀)

保證了乙個事務不會修改已經由另乙個事務讀取但未提交(回滾)的資料。可避免髒讀、不可重複讀情況的發生。

read committed(讀已提交)

大多數主流資料庫的預設事務等級。可避免髒讀情況發生。

read uncommitted(讀未提交)

保證了讀取過程中不會讀取到非法資料。最低級別,以上情況均無法保證。

常見的傳播行為

propagation_required(預設)

支援當前事務,如果當前沒有事務,就新建乙個事務,最常見的選擇。

propagation_supports

支援當前事務,如果當前沒有事務,就以非事務方式執行。

propagation_mandatory

支援當前事務,如果當前沒有事務,就丟擲異常。

propagation_requires_new

新建事務,如果當前存在事務,把當前事務掛起, 兩個事務之間沒有關係,乙個異常,乙個提交,不會同時回滾

propagation_not_supported

以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

propagation_never

以非事務方式執行,如果當前存在事務,則丟擲異常

nested

巢狀事務,如果當前事務存在,那麼在巢狀的事務中執行。如果當前事務不存在,則表現跟required一樣。

事務的隔離級別舉例 事務,事務隔離級別,傳播行為

什麼是事務 事務是訪問資料庫的乙個操作序列,資料庫應用系統通過事務集來完成對資料庫的訪問。事務的正確執行使得資料庫從一種狀態轉換為另一種狀態,事務須服從acid原則 原子性 事務要麼全部被執行,要麼全部不執行。成功則資料庫狀態發生變化,失敗則不會發生狀態轉換 一致性 使資料庫從一種正確狀態轉換成另外...

事務隔離級別 傳播行為

隔離級別 isolation.read uncommitted 讀未提交 isolation.read committed讀已提交 會出現 不可重複讀 虛讀 oracle的預設隔離級別 repeatable read 有可能會發生 虛讀 mysql的隔離級別 serializable 序列化 同一時...

事務隔離級別和傳播機制

事務隔離級別由低往高可分為以下幾類 read uncommitted 讀取未提交的資料。這是最不安全的一種級別,查詢語句在無鎖的情況下執行,並能讀取到別的未提交的資料,造成髒讀,如果未提交的那個 事務資料全部回滾了,而之前讀取了這個事務的資料即是髒資料,這種資料不一致性讀造成的危害是可想而知的。re...