javaweb基礎之mysql回溯筆記(二)
文章目錄
mysql的事務
定義
指對資料庫的一組操作,要麼都執行要麼都不執行;老實說,對事務的定義,其實還是很模糊的概念,這裡留下個坑;等我以後真正見識過事務,再來定義什麼是事務!
四大特性
原子性
英文名為:Atomicity
解釋為:
事務中的所有操作都是不可分割的原子單位,SQL語句要麼都成功要麼都失敗;
一致性
英文名為:Consistency
解釋為:
事務執行後,其資料庫的狀態和其它業務規則保持一致;
隔離性
英文名為:lsolation
解釋為:
在併發操作中,不同事務之間應該隔離開來,併發事務之間不干擾
永續性
英文名為:durability
解釋為:
事務提交之後,對資料庫的修改應該是永久的,其結果記錄在儲存設定中;
注意:
所有的特性都是為了一致性而存在,無論是原子性,隔離性,還是永續性,其最終的目的都是為了實現了事務的一致性,即資料庫的狀態是跟其它的業務規則保持一致的!
併發事務問題
兩類更新問題,三類讀取問題
更新問題來自於文章:
兩類更新問題如下:
第一類丟失更新 :
A,B 事務同時操作同一資料,A先對改資料進行了更改,B再次更改時失敗然後回滾,把B更新的資料也回滾了。(事務撤銷造成的撤銷丟失)
5)第二類丟失更新
A,B事務同時操作同一資料,A先對改資料進行了更改,B再次更改並且提交,把B提交的資料給覆蓋了。(事務提交造成的覆蓋丟失)
讀取問題如下:
髒讀:
事務B讀取了事務A未提交的資料;也就是讀取了未在資料庫提交的資料;
不可重複讀:
事務B第一次讀取資料S,在事務B第二次讀取資料S之前,也就是還未提交資料S的時候;事務A對資料S進行了修改,並且提交成功;這時事務B讀取到了兩次不同的資料;其不同的資料是在於數值改變了;
幻讀:
事務B第一次讀取資料S,在事務B第二次讀取資料S之前,也就是還未提交資料S的時候;事務A對資料S進行了增加或者刪除的操作,並且提交成功;這時事務B讀取到了兩次不同的資料;其不同的資料是在於表記錄改變了;
mysql中事務隔離級別
詳情參考來自於博文:
隔離級別分為:
1.read uncommitted(讀未提交)
3.repeatable read(重複讀)
4.serializable(序列化)
其隔離級別由低到高為:
1<2<3<4
讀未提交<讀已提交<重複讀<序列化
解釋
-
Read UnCommitted(讀未提交)
最低的隔離級別。一個事務可以讀取另一個事務並未提交的更新結果。 -
Read Committed(讀提交)
大部分資料庫採用的預設隔離級別。一個事務的更新操作結果只有在該事務提交之後,另一個事務才可以的讀取到同一筆資料更新後的結果 -
Repeatable Read(重複讀)
mysql的預設級別。整個事務過程中,對同一筆資料的讀取結果是相同的,不管其他事務是否在對共享資料進行更新,也不管更新提交與否。 -
Serializable(序列化)
最高隔離級別。所有事務操作依次順序執行。注意這會導致併發度下降,效能最差。通常會用其他併發級別加上相應的併發鎖機制來取代它。
以上解釋的內容均引用於提到博文b:
理解:
在四大隔離級別中:
1.最低級別的read uncommitted,連未提交的資料都會讀取,那麼很明顯髒讀也就防止不了,髒讀是對未提交的資料都讀取,至於不可重複讀和幻讀肯定也防止不了。。。
可防止的併發訪問:
無
2.第三的級別是read committed,讀已提交的資料;不可重複讀和幻讀都是已提交的資料被讀取到,所以這個是防止不了不可重複讀和幻讀的;
可防止的併發訪問:
髒讀
可防止的併發訪問:
髒讀,不可重複讀
4.第一級別是Serializable,對同一資料是依順序的序列訪問的
可防止的併發訪問:
髒讀,不可重複讀,幻讀