1. 程式人生 > >事物的四個特性和四個隔離級別

事物的四個特性和四個隔離級別

什麼事物

事物是一條或者多條sql語句組成的執行序列,這個序列中的所有語句都屬於同一個工作單元,要麼同時完成,其中如果有一個失敗,則其他操作都要回滾。

原子性 (Atomicity)

事物是一個不可分割的資料庫邏輯工作單位,要麼全部完成,要不失敗回滾。

一致性 (Consistency)

事務執行的結果必須使資料庫從一個一致性狀態變到另一個一致性狀態。

隔離性 (Isolation)

一個事物的執行不能被別的併發事物所幹擾

永續性 (Durability)

事物一旦提交,其對資料庫的改變應該是永久的。

隔離級別

資料庫4中隔離級別如下所示。

隔離級別 髒讀 不可重複讀 幻讀
Read uncommitted(讀未提交的)
Read committed (讀已提交的) ×
Repeatable read(可重複的) × ×
Serializable(可序列化) × × ×

髒讀:即一個事物讀到了另一個事物(當其執行插入,更新等操作時)未提交的資料。讀髒資料一般來說是不被允許的,許多資料庫預設設定的隔離級別也不會是讀未提交的,如oracle預設的是讀已提交的,在oracle中,當前一個事物如果未提交,其DML操作,對別的事物來說是不可見的,未提交的資料,存在快取記憶體區當中,只有提交了之後才會持久化。而mysql預設的資料庫隔離級別是可重複讀。

不可重複讀:(在沒有加鎖的情況下)事物A,執行前後2次執行一條sql,發現sql的結果不同,因為B事物在A事物執行第二次查詢的時候,對A的結果的某些行提交了進行了更新,或者刪除,並提交了事物。導致A事物,第二次查詢出的結果和第一次不一樣。

幻讀:A事物執行一條sql查詢,B事物對A事物sql的相關表新增一條資料,並提交。A事物第二次查詢時發現數據行增加了。由此出現了幻讀,可重複讀和幻讀的區別在於,前者是對已存在的資料進行併發操作,後者則是新增資料對舊的結果集的影響。有時候幻讀是我們需要的,有時候是不需要的,這還得看具體業務的要求。

Serializable(可序列化) :嚴重影響資料庫效能,一般不會用到。
企業中大多數都是使用Read commited來避免髒讀,如果要避免不可重複讀則需要加樂觀鎖或悲觀鎖來對,資料操作定製不同的策略來解決。