一、臟讀、不可重復讀、幻象讀的區別
1、臟讀:包含未提交數據的讀取。例如,事務 a 更改了某行(數據庫已發生更改,但尚未提交,有可能發生回滾),事務 b 在事務 a 提交更改之前讀取已更改的行。如果事務 a 回滾更改,則事務 b 讀取到了不存在的臟數據
2、不可重復讀取:當某個事務(a)不止一次讀取同一行,並且一個單獨的事務(b)在兩次或多次讀取之間修改了該行,所以事務(a)每次讀取的該行的值都不同。
3、幻象:是指當事務不是獨立執行時發生的一種現象。例如當事務(a)對一個表中的數據進行全部修改時,第二個事務(b)向表中插入一行新數據。則事務(a)發現表中還有沒修改的數據,如同發生了幻覺一樣。
二、SQL Server 鎖類型
1、共享鎖:用於只讀操作(select),鎖定共享的資源。共享鎖不會阻止其他用戶讀,但是阻止其他用戶的寫和修改,以避免臟讀
2、更新鎖:更新鎖是一種意圖鎖,當一個事務已經請求共享鎖后並試圖請求一個獨占鎖的時候發生更新鎖。例如當兩個事務在幾行數據行上都使用了共享鎖,並同時試圖獲取獨占鎖以執行更新操作時,就發生了死鎖,都在等待對方釋放共享鎖而實現獨占鎖。更新鎖的目的是只讓一個事務獲得更新鎖,防止這種情況發生。
3、獨占鎖:一次只能有一個獨占鎖用在一個資源上,並且阻止其他所有的鎖包括共享鎖。寫是獨占鎖,可以有效的防止“臟讀”。
4、意圖鎖:在使用共享鎖和獨占鎖之前,使用意圖鎖。從表的層次上產看意圖鎖,以判斷事物能否獲取共享鎖和獨占鎖,提供了系統的性能,不需從頁或者行上檢查。
5、計划鎖:Sch-M,Sch-S。對數據庫結構改變時用Sch-M,對查詢進行編譯時使用Sch-S。這兩種鎖不會阻塞任何事物鎖,包括獨占鎖。
三、 .net 提供的數據庫事務隔離級別 System.Data.IsolationLevel 枚舉用於指定連接的事務鎖行為,包含如下枚舉:
| 成員名稱 | 成員名稱 | 說明 |
| Chaos | 混亂 | 無法改寫隔離級別更高的事務中的掛起的更改 |
| ReadUncommitted | 未提交讀 | 可以進行臟讀,意思是說,不發布共享鎖,也不接受獨占鎖 |
| ReadCommitted | 提交讀 | 在正在讀取數據時保持共享鎖,以避免臟讀,但是在事務結束之前可以更改數據,從而導致不可重復的讀取或幻象數據 |
| RepeatableRead | 可重復讀 | 在查詢中使用的所有數據上放置鎖,以防止其他用戶更新這些數據。防止不可重復的讀取,但是仍可以有幻象行 |
| Serializable | 可串行讀 | 在DataSet 上放置范圍鎖,以防止在事務完成之前由其他用戶更新行或向數據集中插入行 |
| Snapshot | 快照 | 通過在一個應用程序正在修改數據時存儲另一個應用程序可以讀取的相同數據版本來減少阻止。表示您無法從一個事務中看到在其他事務中進行的更改,即便重新查詢也是如此。 |
| Unspecified | 未指定的 | 正在使用與指定隔離級別不同的隔離級別,但是無法確定該級別。當使用OdbcTransaction 時,如果不設置IsolationLevel 或者將 IsolationLevel 設置為Unspecied,事務將根據基礎ODBC驅動程序的默認隔離級別來執行。 |
