資料庫事務特性和隔離級別

2022-07-22 09:18:07 字數 2424 閱讀 4601

資料庫事務是資料庫管理系統執行過程中的乙個邏輯單位,有乙個有限的資料庫操作序列完成。以 「a賬戶向b賬戶匯錢」 為例,乙個事務是下面乙個操作序列:

a. 從a賬號中把餘額讀出來。

b. 對a賬號做減法操作。

c. 把結果寫回a賬號中。

d. 從b賬號中把餘額讀出來。

e. 對b賬號做加法操作。

f.  把結果寫回b賬號中。

事務有四大特徵,分別為原子性(atomic),一致性(consistency),隔離性(isolation),永續性(durability)。

原子性(atomic):

事務中包含的操作被看做乙個邏輯單元,這個邏輯單元中的操作要麼全部成功,要麼全部失敗回滾。事務的原子性也體現在事務對資料的讀取上,例如乙個事務對同一資料項的多次讀取的結果一定是相同的。

一致性(consistency):

一致性是指事務必須使資料庫從乙個一致性狀態變換到另乙個一致性狀態,也就是說乙個事務執行之前和執行之後都必須處於一致性狀態。比如,假設使用者a和使用者b兩者的錢加起來一共是5000,那麼不管a和b之間如何轉賬,轉幾次賬,事務結束後兩個使用者的錢相加起來應該還得是5000,這就是事務的一致性。

有些時候這種一致性由資料庫的內部規則保證,例如資料的型別必須正確,資料值必須在規定的範圍內,等等。

另外一些時候這種一致性由應用保證的,例如,** 一般情況下銀行賬務餘額不能是負數,信用卡消費不能超過該卡的信用額度等。**

隔離性(isolation):

事務允許多個使用者對同乙個資料進行併發訪問,而不破壞資料的正確性和完整性。

同時,並行事務的修改必須與其他並行事務的修改相互獨立。

事務的隔離性一般由事務的鎖來進行控制。

許多時候資料庫在併發執行多個事務,每個事務可能需要對多個表進行修改和查詢,與此同時,更多的查詢請求可能要在執行。資料庫需要保證每乙個事務在它的修改全部完成之前,對其他的事務是不可見的。

換句話說,不能讓其他事務看到該事務的中間狀態,例如,從銀行賬戶a轉一比款項a到賬戶b,不能讓其他事務(例如賬戶查詢)看到a賬戶已經扣除款項a但b賬戶卻沒有增加款項a的狀態。

永續性(durability):

事務結束後,事務處理的結果必須能夠得到固化,即使系統出現各種異常也是如此。

即乙個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。

在多執行緒併發的環境下,當有多個執行緒都開啟事務運算元據庫中的資料時,資料庫系統要能夠進行隔離操作,以確保各個執行緒獲取資料的準確性。否則,可能會出現以下幾種問題:

當兩個或多個事務選擇同一行,然後基於最初選定的值更新該行時,由於每個事務都不知道其他事務的存在,就會發生丟失更新問題——最後的更新覆蓋了其他事務所做的更新。例如,兩個編輯人員製作了同一文件的電子副本。每個編輯人員獨立地更改其副本,然後儲存更改後的副本,這樣就覆蓋了原始文件。最後儲存其更改儲存其更改副本的編輯人員覆蓋另乙個編輯人員所做的修改。如果在乙個編輯人員完成並提交事務之前,另乙個編輯人員不能訪問同一檔案,則可避免此問題。通常,「更新丟失」在併發事務處理中通常是完全避免的。

髒讀是指在乙個事務處理過程裡讀取了另乙個未提交的事務中的資料。

當乙個事務正在多次修改某個資料,而在這個事務中這多次修改還都未提交時,乙個併發的事務來訪問該資料,就會造成兩個事務得到的資料不一致。

不可重複讀是指在對於資料庫中的某個資料,乙個事務範圍內多次查詢卻返回了不同的資料值,這是由於在查詢間隔,資料被另乙個事務修改並提交了。

不可重複讀和髒讀的區別是,髒讀是某一事務讀取了另乙個事務未提交的髒資料,而不可重複讀是讀取了前乙個事務提交了的資料。

幻讀是事務非獨立執行時發生的一種現象。例如事務t1對乙個表中所有的行的某個資料項做了從「1」修改為「2」的操作,這時事務t2又對這個表中插入了一行資料項,而這個資料項的數值還是為「1」並且提交給資料庫。而操作事務t1的使用者如果再檢視剛剛修改的資料,會發現還有一行沒有修改,其實這行是從事務t2中新增的,就好像產生幻覺一樣,這就是發生了幻讀。

幻讀和不可重複讀都是讀取了另一條已經提交的事務(髒讀不同),所不同的是不可重複讀查詢的都是同乙個資料項,而幻讀針對的是一批整體資料。

接下來看看mysql提供的四種隔離級別:

serializable(序列化):可避免髒讀、不可重複讀、幻讀的發生

repeatable read(可重複讀):可避免髒讀、不可重複讀的發生

read committed(讀已提交):可避免髒讀的發生

read uncommitted(讀未提交):最低級別,無法避免

這四種級別最高的是serializable,最低的是read uncommitted,級別越高,執行效率越低。mysql的預設級別為repeatable read.

需要注意的是,這四種級別都要求當乙個事務在進行寫操作時,不允許其他事務進行寫操作,可通過「排他寫鎖」實現。

資料庫事務特性和隔離級別

一 事務的基本要素 acid 1 原子性 atomicity 事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是乙個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。2 一致性 co...

資料庫事務特性和隔離級別

一組業務操作,要麼全部成功,要麼全部不成功。原子性 乙個事務是乙個整體,不可分割,事務中的操作要麼都成功,要麼都失敗。一致性 事務必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。事務執行前後,資料庫的狀態是一致的。例如 a有1000,元,b有1000元,加起來是2000,中間執行轉賬的操作,轉賬...

資料庫事務的特性和隔離級別

acid的事務特性 原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 原子性就是要麼成功要麼失敗。一致性就是比如存款總額不變。從乙個一致性狀態轉移到另乙個一致性狀態。事務之間不可以相互影響。事務在提交之前是不被其他事務可見的。事務完...