數據庫事務四大特性、隔離級別和七大傳播行爲

事務四大特性

原子性(Atomicity)

一個事務在執行過程中要麼全部成功,要麼全部失敗

一致性(Consistency)

事務在執行之前和執行之後都必須處於一致性狀態。
例如轉賬操作,A有200元,B有100元,A轉賬100元給B,在轉賬前A,B總共有300元,轉賬後兩者總和應該還是300元,這就是事務一致性。

隔離性(Isolation)

當多個事務同時執行一個操作時,爲了保證各個事務之前不會被互相干擾,就要對多個併發事務進行隔離

持久性(Durability)

持久性是指一個事務一旦被提交,那麼對數據庫中的數據的改變時永久性的,即便是數據庫系統出現故障,也不會丟失提交事務的操作

髒讀,不可重複讀,幻讀

髒讀

髒讀就是別的事務讀取了另一個事務未提交的數據,當A事務對X進行了修改,此時還沒提交,而B事務對進行了修改的X進行了讀取,並進行了其他操作,而後A事務回滾了,這樣B事務就出現了髒讀

不可重複讀

事務A讀取了數據A,然後執行邏輯的時候,B事務對數據A進行了改變,當A再次讀取時,發現前後數據不匹配,就是不可重複讀

幻讀

事務A對數據是1的進行了更改,而事務B新添了一個數據也是1,當數據再次操作時會發現還有一個1沒有更改,這就是發生了幻讀

事務的四種隔離級別

Read Uncommitted(讀取未提交內容)

所有事務都可以看到其他未提交事務的執行結果,該級別會引發髒讀的問題

Read Committed(讀取已提交內容)

滿足了一個事務只能看見已經提交的事務所做出的改變;但是會出現不可重複讀的問題,在同一個事務執行完全相同的查詢可能出現不一樣的結果

Repeatable Read(可重複讀)

這是MySQL默認的隔離級別同一個事務執行相同的查詢會看到同樣的數據,但是此操作級別可能會出現幻讀

Serializable(可串行化)

這是最高的隔離級別,通強制事務排序,使之不可能出現衝突。它會在每個讀中加入共享鎖。但是這個級別可能導致大量的超時和鎖競爭

事務的七大傳播行爲

PROPAGATION_REQUIRED

支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。

PROPAGATION_SUPPORTS

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

PROPAGATION_MANDATORY

支持當前事務,如果當前沒有事務,就拋出異常。

PROPAGATION_REQUIRES_NEW

新建事務,如果當前存在事務,把當前事務掛起。

PROPAGATION_NOT_SUPPORTED

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

PROPAGATION_NEVER

以非事務方式執行,如果當前存在事務,則拋出異常。

PROPAGATION_NESTED

如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則新建一個事務

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