乙個資料庫事務是"乙個被視為單一的工作單元的操作序列"。乙個良好的事務處理系統,必須具備四個標準特性:
原子性(atomicity):乙個事務必須被視為乙個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於乙個事務來說,不可能只執行其中的一部分操作,這就是事務的原子性。
一致性(consistency):資料庫總是從乙個一致性的狀態轉換到另乙個一致性的狀態。(在前面的例子中,一致性確保了,即使在執行第
三、四條語句之間時系統崩潰,支票賬戶中也不會損失200美元,因為事務最終沒有提交,所以事務中所做的修改也不會儲存到資料庫中。)
隔離性(isolation):通常來說,乙個事務所做的修改在最終提交以前,對其他事務是不可見的。
永續性(durability):一旦事務提交,則其所做的修改會永久儲存到資料庫。(此時即使系統崩潰,修改的資料也不會丟失。永續性是個有點模糊的概念,因為實際上永續性也分很多不同的級別。有些永續性策略能夠提供非常強的安全保障,而有些則未必,而且不可能有能做到100%的永續性保證的策略。)
以上四個特性就是常說的acid。
隔離性的四個級別:
read uncommitted(未提交讀)
在read uncommitted級別,事務中的修改,即使沒有提交,對其他事務也都是可見的。事務可以讀取未提交的資料,這也被稱為髒讀(dirty read)。這個級別會導致很多問題,從效能上來說,read uncommitted不會比其他的級別好太多,但卻缺乏其他級別的很多好處,除非真的有非常必要的理由,在實際應用中一般很少使用。
read committed(提交讀)
大多數資料庫系統的預設隔離級別都是read commtted(但mysql不是)。read committed滿足前面提到的隔離性的簡單定義:乙個事務開始時,只能"看見"已經提交的事務所做的修改。換句話說,乙個事務從開始直到提交之前,所做的任何修改對其他事務都是不可見的。這個級別有時候叫做不可重複讀(nonrepeatble read),因為兩次執行同樣的查詢,可能會得到不一樣的結果。
repeatable read(可重複讀)
repeatable read解決了髒讀的問題。該隔離級別保證了在同乙個事務中多次讀取同樣記錄結果是一致的。但是理論上,可重複讀隔離級別還是無法解決另外乙個幻讀(phantom read)的問題。所謂幻讀,指的是當某個事務在讀取某個範圍內的記錄時,另乙個事務又在該範圍內插入了新的記錄,當之前的事務再次讀取該範圍的記錄時,會產生幻行(phantom row)。innodb和xtradb儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control)解決了幻讀的問題。
serializable(序列化)
serializable是最高的隔離級別。它通過強制事務序列執行,避免了前面說的幻讀的問題。簡單來說,serializable會在讀取每一行資料都加鎖,所以可能導致大量的超時和鎖爭用問題。實際應用中也很少用到這個隔離級別,只有在非常需要確保資料的一致性而且可以接受沒有併發的情況下,才考慮採用該級別。
mysql事務四個特性 事務的四個特性
事務的四個特性 1.原子性 atomicity 1.1什麼是原子性 一般來說,原子是指不能分解成小部分的東西。這個詞在計算的不同分支中意味著相似但又微妙不同的東西。例如,在多執行緒程式設計中,如果乙個執行緒執行乙個原子操作,這意味著另乙個執行緒無法看到該操作的一半結果。系統只能處於操作之前或操作之後...
事物的四個特性和四個隔離級別
事物是一條或者多條sql語句組成的執行序列,這個序列中的所有語句都屬於同乙個工作單元,要麼同時完成,其中如果有乙個失敗,則其他操作都要回滾。事物是乙個不可分割的資料庫邏輯工作單位,要麼全部完成,要不失敗回滾。事務執行的結果必須使資料庫從乙個一致性狀態變到另乙個一致性狀態。乙個事物的執行不能被別的併發...
事務 事務的四個特性
現實生活中,我們往往經常會進行轉賬操作,轉賬操作可以分為兩部分來完成,轉入和轉出。只有這兩部分都完成了才可以認為是轉賬成功。在資料庫中,這個過程是使用兩條語句來完成的,如果其中任意一條語句出現了異常沒有執行,則會導致兩個賬號的金額不同步,造成錯誤。為了防止上面可能出現的情況,mysql引入了事務,所...