1. 程式人生 > 資料庫 >javaweb基礎之mysql回溯筆記(二)

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(讀未提交)

2.read committed(讀已提交)
3.repeatable read(重複讀)
4.serializable(序列化)

其隔離級別由低到高為:
1<2<3<4
讀未提交<讀已提交<重複讀<序列化

解釋

  1. Read UnCommitted(讀未提交)
    最低的隔離級別。一個事務可以讀取另一個事務並未提交的更新結果。

  2. Read Committed(讀提交)
    大部分資料庫採用的預設隔離級別。一個事務的更新操作結果只有在該事務提交之後,另一個事務才可以的讀取到同一筆資料更新後的結果

  3. Repeatable Read(重複讀)
    mysql的預設級別。整個事務過程中,對同一筆資料的讀取結果是相同的,不管其他事務是否在對共享資料進行更新,也不管更新提交與否。

  4. Serializable(序列化)
    最高隔離級別。所有事務操作依次順序執行。注意這會導致併發度下降,效能最差。通常會用其他併發級別加上相應的併發鎖機制來取代它。

以上解釋的內容均引用於提到博文b:

理解:

在四大隔離級別中:
1.最低級別的read uncommitted,連未提交的資料都會讀取,那麼很明顯髒讀也就防止不了,髒讀是對未提交的資料都讀取,至於不可重複讀和幻讀肯定也防止不了。。。
可防止的併發訪問:


2.第三的級別是read committed,讀已提交的資料;不可重複讀和幻讀都是已提交的資料被讀取到,所以這個是防止不了不可重複讀和幻讀的;
可防止的併發訪問:
髒讀

3.第二級別是repeatable read,可重複讀;都說了可重複讀,那麼肯定可以防止不可重複讀;
可防止的併發訪問:
髒讀,不可重複讀

4.第一級別是Serializable,對同一資料是依順序的序列訪問的
可防止的併發訪問:
髒讀,不可重複讀,幻讀