事務四大特性
原子性(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
如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則新建一個事務