資料庫的事務 ACID及隔離級別

2022-04-09 13:57:42 字數 2078 閱讀 5294

所謂事務是使用者定義的乙個資料庫操作序列,這些操作要麼全做,要麼不做,是乙個不可分割的工作單位。例如,在關聯式資料庫中,一條或一組sql語句、整個程式都可以是乙個事務。

事務和程式是兩個概念,乙個程式中可以有多個事務。

在sql中,事務定義的三條語句:

begin transaction;(開始)

commit;     (提交)

rollback;  (回滾)

事務通常以begin transaction開始,以commit或rollback結束。commit表示提交事務的所有操作。具體地說就是將事務中所有的對資料庫的更新寫回磁碟上的物理資料庫中,事務正常結束。rollback表示回滾,即事務執行過程中發生了故障,事務不能繼續執行,系統將事務中對資料庫中所有已完成的操作全部撤回,回滾到事務開始的狀態。

事務具有4個特性:原子性(a)、一致性(c)、隔離性(i)和持續性(d)。這四個特性簡稱acid特性

(1)原子性

事務是資料庫的邏輯工作單位,事務中包括的諸多操作要麼多做,要麼不做。

(2)一致性

事務執行的結果必須是使資料庫從乙個一致性狀態轉變到另乙個一致性狀態。因此當資料庫只包含成功執行事務提交結果時,就說資料庫處於一致性狀態。當事務執行發生故障時,如果這些未完成的事務對資料庫所做個的修改有一部分已經寫入物理資料庫,這時資料庫便處於不一致性狀態(邏輯錯誤)。例如銀行轉賬事務。

(3)隔離性

事務的執行不能被其他事務干擾。即乙個事務的內部操作及使用的資料對其他事務是隔離的,併發執行的各個事務之間不能相互打擾。

(4)持續性

持續性也稱永久性,指乙個事務一旦提交,它對資料庫中資料的改變就是永久性的。接下來發生的任何其他操作故障不應該對其執行結果造成影響。

read uncommitted(讀取未提交內容)

在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少。讀取未提交的資料,也被稱之為髒讀(dirty read)。

read committed(讀取提交內容)

這是大多數資料庫系統的預設隔離級別(但不是mysql預設的)。它滿足了隔離的簡單定義:乙個事務只能看見已經提交事務所做的改變。這種隔離級別 也支援所謂的不可重複讀(nonrepeatable read),因為同一事務的其他例項在該例項處理其間可能會有新的commit,所以同一select可能返回不同結果。

repeatable read(可重讀)

這是mysql的預設事務隔離級別,它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行。不過理論上,這會導致另乙個棘手的問題:幻讀 (phantom read)。簡單的說,幻讀指當使用者讀取某一範圍的資料行時,另乙個事務又在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的「幻影」 行。innodb和falcon儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control)機制解決了該問題。

serializable(可序列化)

這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。

這四種隔離級別採取不同的鎖型別來實現,若讀取的是同乙個資料的話,就容易發生問題。例如:

髒讀(drity read):某個事務已更新乙份資料,另乙個事務在此時讀取了同乙份資料,由於某些原因,前乙個rollback了操作,則後乙個事務所讀取的資料就會是不正確的。

不可重複讀(non-repeatable read):在乙個事務的兩次查詢之中資料不一致,這可能是兩次查詢過程中間插入了乙個事務更新的原有的資料。

幻讀(phantom read):在乙個事務的兩次查詢中資料筆數不一致,例如有乙個事務查詢了幾列(row)資料,而另乙個事務卻在此時插入了新的幾列資料,先前的事務在接下來的查詢中,就會發現有幾列資料是它先前所沒有的。

在mysql中,實現了這四種隔離級別,分別有可能產生問題如下所示:

資料庫 ACID及事務隔離級別

事務 併發控制和恢復的基本單位。atomicity原子性 事務是資料庫的邏輯工作單位,事務中包括的所有操作要麼都做,要麼什麼都不做。consistency一致性 事務執行的結果必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。例如對銀行轉帳事務,不管事務成功還是失敗,應該保證事務結束後accoun...

資料庫事務ACID特性及隔離級別

資料庫acid特性介紹 1 原子性 atomic 乙個事務被視為乙個不可分割的最小工作單元,這個事務裡的所有操作要麼全部成功執行,要麼全都不執行,不能只執行其中的一部分操作。實現事務的原子性,要支援回滾操作,在某個操作失敗後,回滾到事務執行之前的狀態。回滾是乙個抽象概念,大多數資料庫在實現事務時是在...

資料庫(一) ACID,事務,隔離級別

事務 transaction 最簡單的理解就是多個對資料庫操作的有序組合。舉例來說,多個順序執行的sql語句就構成了乙個事務。在現實中,對於資料庫的資料操作,基本以事務為基本單位。最常見的例子,轉賬時,a賬戶扣掉100,b賬戶增加100,這些操作,都是需要至少兩個以上的sql語句來完成的。從資料庫操...