溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

數(shù)據(jù)庫的事務(wù)和隔離等級

發(fā)布時間:2020-06-22 09:05:33 來源:億速云 閱讀:173 作者:Leah 欄目:MySQL數(shù)據(jù)庫

這篇文章將為大家詳細講解有關(guān)數(shù)據(jù)庫的事務(wù)和隔離等級,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

事務(wù)

事務(wù)指的是滿足 ACID 特性的一組操作,可以通過 Commit 提交一個事務(wù),也可以使用 Rollback 進行回滾。

ACID

1.原子性(Atomicity)

事務(wù)被視為不可分割的最小單元,事務(wù)的所有操作要么全部提交成功,要么全部失敗回滾?;貪L可以用回滾日志來實現(xiàn),回滾日志記錄著事務(wù)所執(zhí)行的修改操作,在回滾時反向執(zhí)行這些修改操作即可。

2.一致性(Consistency)

一致性是指事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài),也就是說一個事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。

拿轉(zhuǎn)賬來說,假設(shè)用戶A和用戶B兩者的錢加起來一共是5000,那么不管A和B之間如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個用戶的錢相加起來應(yīng)該還得是5000,這就是事務(wù)的一致性。

3.隔離性(Isolation)

隔離性是當(dāng)多個用戶并發(fā)訪問數(shù)據(jù)庫時,比如操作同一張表時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個并發(fā)事務(wù)之間要相互隔離。

即要達到這么一種效果:對于任意兩個并發(fā)的事務(wù)T1和T2,在事務(wù)T1看來,T2要么在T1開始之前就已經(jīng)結(jié)束,要么在T1結(jié)束之后才開始,這樣每個事務(wù)都感覺不到有其他事務(wù)在并發(fā)地執(zhí)行。

4.持久性(Durability)

持久性是指一個事務(wù)一旦被提交了,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務(wù)的操作。

并發(fā)一致性問題

1.臟讀

臟讀是指在一個事務(wù)處理過程里讀取了另一個未提交的事務(wù)中的數(shù)據(jù)。

T1 修改一個數(shù)據(jù),T2 隨后讀取這個數(shù)據(jù)。如果 T1 撤銷了這次修改,那么 T2 讀取的數(shù)據(jù)是臟數(shù)據(jù)。

數(shù)據(jù)庫的事務(wù)和隔離等級

2.不可重復(fù)讀

不可重復(fù)讀是指在對于數(shù)據(jù)庫中的某個數(shù)據(jù),一個事務(wù)范圍內(nèi)多次查詢卻返回了不同的數(shù)據(jù)值,這是由于在查詢間隔,被另一個事務(wù)修改并提交了。

例如事務(wù)T1在讀取某一數(shù)據(jù),而事務(wù)T2立馬修改了這個數(shù)據(jù)并且提交事務(wù)給數(shù)據(jù)庫,事務(wù)T1再次讀取該數(shù)據(jù)就得到了不同的結(jié)果,發(fā)送了不可重復(fù)讀。

不可重復(fù)讀和臟讀的區(qū)別是,臟讀是某一事務(wù)讀取了另一個事務(wù)未提交的臟數(shù)據(jù),而不可重復(fù)讀則是讀取了前一事務(wù)提交的數(shù)據(jù)。

數(shù)據(jù)庫的事務(wù)和隔離等級

3.幻讀

幻讀是事務(wù)非獨立執(zhí)行時發(fā)生的一種現(xiàn)象。例如事務(wù)T1對一個表中所有的行的某個數(shù)據(jù)項做了從“1”修改為“2”的操作,這時事務(wù)T2又對這個表中插入了一行數(shù)據(jù)項,而這個數(shù)據(jù)項的數(shù)值還是為“1”并且提交給數(shù)據(jù)庫。而操作事務(wù)T1的用戶如果再查看剛剛修改的數(shù)據(jù),會發(fā)現(xiàn)還有一行沒有修改,其實這行是從事務(wù)T2中添加的,就好像產(chǎn)生幻覺一樣,這就是發(fā)生了幻讀。

幻讀和不可重復(fù)讀都是讀取了另一條已經(jīng)提交的事務(wù)(這點就臟讀不同),所不同的是不可重復(fù)讀查詢的都是同一個數(shù)據(jù)項,而幻讀針對的是一批數(shù)據(jù)整體(比如數(shù)據(jù)的個數(shù))。

T1 讀取某個范圍的數(shù)據(jù),T2 在這個范圍內(nèi)插入新的數(shù)據(jù),T1 再次讀取這個范圍的數(shù)據(jù),此時讀取的結(jié)果和和第一次讀取的結(jié)果不同。

數(shù)據(jù)庫的事務(wù)和隔離等級

MySQL隔離級別

1. Serializable (串行化):強制事務(wù)串行執(zhí)行。

可避免臟讀、不可重復(fù)讀、幻讀的發(fā)生。

2. Repeatable read (可重復(fù)讀):保證在同一個事務(wù)中多次讀取同樣數(shù)據(jù)的結(jié)果是一樣的

可避免臟讀、不可重復(fù)讀的發(fā)生。

3. Read committed (讀已提交):一個事務(wù)只能讀取已經(jīng)提交的事務(wù)所做的修改

可避免臟讀的發(fā)生。

4. Read uncommitted (讀未提交):事務(wù)中的修改,即使沒有提交,對其他事務(wù)也是可見的

最低級別,任何情況都無法保證。

隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,級別越高,執(zhí)行效率就越低。

像Serializable這樣的級別,就是以鎖表的方式(類似于Java多線程中的鎖)使得其他的線程只能在鎖外等待,所以平時選用何種隔離級別應(yīng)該根據(jù)實際情況。

在MySQL數(shù)據(jù)庫中默認的隔離級別為Repeatable read (可重復(fù)讀)。

Oracle數(shù)據(jù)庫中,只支持 Serializable (串行化) 級別和 Read committed (讀已提交) 這兩種級別,其中默認的為Read committed級別。

關(guān)于數(shù)據(jù)庫的事務(wù)和隔離等級就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI