天天看點

事務的ACID與隔離級别

定義

事務是應用程式中一系列嚴密的操作,所有操作必須一起成功完成,否則在每個操作中進行的更改都會被撤銷。

ACID

事務具有四個特征:

1.原子性(Atomicity):事務是資料庫的邏輯工作機關,事務中包含的各操作要麼都完成,要麼都不完成。

2.一緻性(Consistency):事務執行的結果必須是使資料庫從一個一緻性狀态變到另一個一緻性狀态,對于整個資料的完整性保持穩定。

3.隔離性(Isolation):事務與事務之間互不幹擾,即一個事務内部的操作及使用的資料對其它并行事務是隔離的。

4.持久性(Durability):事務一旦送出,對資料庫中的資料更改就是永久性的。

隔離級别

在并發處理資料時,所采取的資料隔離機制。

若沒有采用有效的隔離機制,并發處理資料時會出現以下問題:

1.第一類丢失更新:撤銷一個事務時,把其它事務已送出的更新資料覆寫。

2.髒讀:一個事務處理過程中讀取了另一個未送出的事務中的資料。

3.幻讀:也叫虛讀,一個事務執行兩次查詢,第二次結果集包含第一次沒有或某些行已經被删除的資料,造成兩次結果不一緻,這是另一個事務在這兩次查詢中間插入或删除了資料造成的。

4.不可重複讀:一個事務兩次讀取同一行的資料,結果得到不同狀态的結果,中間正好另一個事務更新了資料。

5.第二類丢失更新:是不可重複讀的特殊情況,如果兩個事務都讀取同一行,然後兩個都進行寫操作,并送出,第一個事務所做的改變就會丢失。

注意:

不可重複讀和髒讀的差別是:髒讀是某一事務讀取了另一個事務未送出的髒資料,不可重複讀則是讀取了前一事務送出的資料。

不可重複讀和幻讀的差別是:幻讀和不可重複讀都是讀取了另一條已經送出的記錄,所不同的是不可重複度查詢的是同一資料項,而幻讀針對的是一批資料整體(比如資料的個數)。

事務的隔離級别有四種,

1.Read uncommitted(最低級别,任何情況都無法保證)

讀未送出,顧明思義,就是一個事務可以讀取另一個未送出事務的資料。

會有髒讀的情況。

2.Read committed(可避免髒讀的發送)

讀送出,顧名思義,就是一個事務要等另一個事務送出後才能讀取資料。

會出現不可重複讀問題。

3.Repeatable read(可避免髒讀、不可重複讀的發送)

重複讀,就是在開始讀取資料(事務開啟)時,不再允許修改操作。

會出現幻讀的情況。

4.Serializable(可避免髒讀、不可重複讀、幻讀的發送)

序列化,是最高的事務隔離級别,在該級别下,事務串行化順序執行,可以避免髒讀、不可重複讀與幻讀。但是這種事務隔離級别效率低下,比較耗資料庫性能,一般不使用。

大多數資料庫預設的事務隔離級别是Read committed,比如sql server和oracle。

Mysql預設的隔離級别是Repeatable read。

隔離級别的設定隻對目前連接配接有效,對于使用mysql指令視窗而言,一個視窗相當于一個連結;對于JDBC操作資料庫來說,一個Connection對象相當于一個連結。

設定資料庫隔離級别一定是要在開啟事務之前。

繼續閱讀