1、原子性1、髒讀(drity read):事務a修改了乙個資料,但未提交,事務b讀到了事務a未提交的更新結果,如果事務a提交失敗,事務b讀到的就是髒資料。整個事務中的所有操作,要麼全部完成,要麼全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
2、一致性
在事務開始之前和事務結束以後,資料庫的完整性約束沒有被破壞。例如,完整性約束了a+b=10,乙個事務改變了a,那麼b也應該隨之改變。
3、隔離性
兩個事務的執行是互不干擾的,乙個事務不可能看到其他事務執行時,中間某一時刻的資料。
4、永續性
在事務完成以後,該事務所對資料庫所作的更改便持久的儲存在資料庫之中,並不會被回滾。
同時也有髒讀也是最低級別的隔離級別。
為了克服髒讀,sql標註提出了第二個隔離級別:讀/寫提交:就是說乙個事務只能讀取另乙個事務已經提交的事務
但是也會引發其他問題
因為事務一不能讀取事務二未提交的事務,所以不知道餘額的變化過程,只能知道餘額最後變化的值,即餘額是乙個變化的值。我們稱之為不可重複讀。
2、不可重複讀(non-repeatable read): 在同乙個事務中,對於同乙份資料讀取到的結果不一致。比如,事務b在事務a提交前讀到的結果,和提交後讀到的結果可能不同。不可重複讀出現的原因就是事務併發修改記錄,要避免這種情況,最簡單的方法就是對要修改的記錄加鎖,這導致鎖競爭加劇,影響效能。
為了克服不可重讀帶來的錯誤,sql標準又提出了乙個隔離級別:可重複讀:針對資料庫的同一條記錄的讀/寫按照乙個序列化操作,不會產生交叉情況,保證資料一致性。
可以認為是鎖住這個記錄。
但是也會產生一些問題
3、幻讀(phantom read): 在同乙個事務中,同乙個查詢多次返回的結果不一致。事務a新增了一條記錄,事務b在事務a提交前後各執行了一次查詢操作,發現後一次比前一次多了一條記錄。幻讀僅指由於併發事務增加記錄導致的問題,這個不能像不可重複讀通過記錄加鎖解決,因為對於新增的記錄根本無法加鎖。需要將事務序列化,才能避免幻讀。
為了克服幻讀,sql推出更高的隔離級別----序列化
1、隨著隔離級別的提高,系統效能逐漸下降(「高風險,高回報」)。
2、序列化會嚴重抑制併發,從而引發大量的執行緒掛起,知道獲取鎖才能進行下一步操作,恢復時又需要等待大量的時間,但是資料絕對安全。
可以在併發量不大但又保證資料安全性的情境下使用。
3、企業一般選擇讀/寫提交模式。
4、mysql支援4中隔離級別,預設為可重複讀,oracle支援讀/寫提交和可重複讀,預設為讀/寫提交。
5、總之:隔離級別需要根據併發量的大小和效能來決定。
資料庫事務ACID
1.原子性 atomicity 原子性是指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。2.一致性 consistency 事務必須使資料庫從乙個一致性狀態變換到另外乙個一致性狀態。3.隔離性 isolation 事務的隔離性是指乙個事務的執行不能被其他事務干擾,即乙個事務內部...
資料庫事務 ACID
資料庫事務 acid 1.原子性 atomicity 乙個事務必須被視為乙個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾。對於乙個事務來說,不可能只執行其中的一部分操作,這就是事物的原子性。2.一致性 consistency 資料庫總是從乙個一致性的狀態轉換到另外乙...
資料庫事務 ACID
事務 乙個操作,乙個要執行sql語句,要麼執行,要麼不執行,是乙個不可分割的工作單位。有如下特性 a 原子性 atomicity c 一致性 consistency i 隔離性 isolation d 永續性 durability 先理解資料庫的一致性 參考這篇部落格 考慮如下場景 公司給員工發工資...