資料庫中的事物是具有原子性(atomicity),一致性(consistemcy),隔離性(isolation),永續性(durability)四個特徵。
1、原子性(atomicity):事務中的全部操作在資料庫中是不可分割的,要麼全部完成,要麼全部不執行。
2、一致性(consistency):幾個並行執行的事務,其執行結果必須與按某一順序 序列執行的結果相一致。
3、奪隔離性(isolation):事務的執行不受其他事務的干擾,事務執行的中間結果對其他事務必須是透明的。
4、奪永續性(durability):對於任意已提交事務,系統必須保證該事務對資料庫的改變不被丟失,即使資料庫出現故障。
事務的acid特性是由關係資料庫系統(dbms)來實現的,dbms採用日誌來保證事務的原子性、一致性和永續性。日誌記錄了事務對資料庫所作的更新,如果某個事務在執行過程中發生錯誤,就可以根據日誌撤銷事務對資料庫已做的更新,使得資料庫同滾到執行事務前的初始狀態。 對於事務的隔離性,dbms是採用鎖機制來實現的。當多個事務同時更新資料庫中相同的資料時,只允許持有鎖的事務能更新該資料,其他事務必須等待,直到前乙個事務釋放了鎖,其他事務才有機會更新該資料。
一致性和隔離性是通過鎖來實現對相同資料的訪問隔離的實現。事物的隔離級別又可以影響鎖的申請和時間的時機。
不同的事物隔離級別又可以對鎖的申請和釋放產生不同的影響,在對資料庫做事物控制的時候需要了解隔離級別對事物的影響。
事務隔離級別通過影響讀操作來間接地影響寫操作;可以在回話級別上設定事務隔離級別也可以在查詢(表級別)級別上設定事務隔離級別。
sql server實現sql99標準規定的事務的四個隔離級別(未提交讀,已提交讀,可重複讀,序列化)之外,另外增加了兩個隔離級別(快照和基於行版本的已提交讀隔離級別)。
不同的隔離級別對控制髒讀,不可重複讀,幻讀有一定的控制,也會併發有一定程度的影響,隔離級別越低,併發性越高,但是產生髒讀,不可重複讀,幻讀等可能性越大;隨著事物隔離級別的提交,可以控制髒讀,不可重複讀,以及幻讀的現象,但是併發性也會隨之降低。事物隔離級別和執行計畫都可以影響鎖(範圍)的申請和釋放時機,本文暫不討論執行計畫對鎖申請的影響,僅在隔離級別上說明鎖的申請和釋放。
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted、read committed、repeatable read、serializable,這四個級別可以逐個解決髒讀、不可重複讀、幻讀這幾類問題。 隔離級別越高,讀操作的請求鎖定就越嚴格,鎖的持有時間久越長;所以隔離級別越高,一致性就越高,併發性就越低,同時效能也相對影響越大.
髒讀:事務a向表中插入了一條資料,此時事務a還沒有提交,此時查詢語句能把這條資料查詢出來,這種現現象稱為髒讀;髒讀比較好理解
不可重複讀:乙個事務a第一次讀取的結果之後, 另外乙個事務b更新了a事務讀取的資料,a事務在第二次讀取的結果和第一次讀取的結果不一樣這種現象稱為不可重複讀
幻讀:事務a查詢表裡面的所有資料,這時事務b向表中插入了一條資料,這時事務a第一次的查詢結果和第二次的查詢結果不一致,這種現象我稱為幻讀。
一.第1級別:read uncommitted(讀取未提交內容) 相當於with(nolock)
(1)所有事務都可以看到其他未提交事務的執行結果;
(2)本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少;
(3)該級別引發的問題是——髒讀(dirty read):讀取到了未提交的資料。
二.第2級別:read committed(讀取提交內容)
(1)這是大多數資料庫系統的預設隔離級別(oracle和sqlserver預設的);
(2)它滿足了隔離的簡單定義:乙個事務只能看見已經提交事務所做的改變;
(3)這種隔離級別出現的問題是——不可重複讀(nonrepeatable read):不可重複讀意味著我們在同乙個事務中執行完全相同的select語句時可能看到不一樣的結果。
導致這種情況的原因可能有:
(1)有乙個交叉的事務有新的commit,導致了資料的改變;
(2)乙個資料庫被多個例項操作時,同一事務的其他例項在該例項處理其間可能會有新的commit。
三.第3級別:repeatable read(可重複讀)相當於(holdlock)
(1)這是mysql的預設事務隔離級別;
(2)它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行;
(3)此級別可能出現的問題——幻讀(phantom read):當使用者讀取某一範圍的資料行時,另乙個事務又在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的「幻影」 行;
(4)innodb和falcon儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control)機制解決了該問題。
四.第4級別:serializable(可序列化)
(1)這是最高的隔離級別;
(2)它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題;簡言之,它是在每個讀的資料行上加上共享鎖;
(3)在這個級別,可能導致大量的超時現象和鎖競爭。
五.:snapshot(快照)
(1)snapshot 在snapshot隔離級別下,當讀取資料時可以保證操作讀取的行是事務開始時可用的最後提交版本
(2)同時snapshot隔離級別也滿足前面的已提交讀,可重複讀,不幻讀;該隔離級別實用的不是共享鎖,而是行版本控制
六.read committedsnapshot(已提交讀快照)
read committed snapshot也是基於行版本控制,但是read committed snapshot的隔離級別是讀操作之前的最後已提交版本,而不是事務前的已提交版本,有點類似前面的read committed能保證已提交讀,但是不能保證可重複讀,不能避免幻讀,但是又比 read committed隔離級別多出了不需要獲取共享鎖就可以讀取資料
SQL Server 事務隔離級別
1 sql server 的 5個標準事務隔離級別分別是 read uncommitted,read committed,repeatable read 和 serializable,snapshot.sql server 使用鎖來實現隔離級別。下面使用 gif 動畫對 sql server 前4 ...
SQL Server事務隔離級別
1 首先是如何檢視sql server的事務的隔離級別 命令 dbcc useroptions 結果如下圖所示 2 如何修改資料庫的事務隔離級別,5中隔離級別的設定 set transaction isolation level read committed set transaction isol...
Sqlserver事務隔離級別詳解
sqlserver儲存方式 頁 sqlserver是以頁的形式儲存資料,每個資料頁的大小為8kb,sqlserver會把空間分為多個頁,sqlserver與資料互動單位最小的io操作就是頁級別。頁的型別有資料頁,索引頁等 區 八個連續的頁會組合成乙個區,區的最少是由八個連續的頁組成。事務隔離級別 1...