1.sql server 下一共有6個事務隔離級別
-- Syntax for SQL Server and Azure SQL Database SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED //讀未提交 | READ COMMITTED //讀提交 | REPEATABLE READ //重復讀 | SNAPSHOT //快照 | SERIALIZABLE //可序列化 | READ COMMITTED SNAPSHOT //讀提交的快照 }
獲取事務隔離級別(isolation level)
DBCC USEROPTIONS
可以看到數據庫默認的transaction 級別為 read committed

設置隔離
設置回話隔離 SET TRANSACTION ISOLATION LEVEL <ISOLATION NAME> --注意:在設置回話隔離時(REPEATABLE READ)兩個單詞需要用空格間隔開,但是在表隔離中可以粘在一起(REPEATABLEREAD) 設置查詢表隔離 SELECT ....FROM <TABLE> WITH (<ISOLATION NAME>)
2.1 read uncommitted 為最低隔離的等級.可以得到沒有提交的數據 請看如下的例子
窗口1:

窗口2:

兩個腳本窗口一先執行,窗口2后執行,我們可以看到窗口2 出現了臟讀,讀到了還沒有提交的數據 "11".
2.2 read committed
下面引用csdn上的描述
指定語句不能讀取已由其他事務修改但尚未提交的數據。 這樣可以避免臟讀。 其他事務可以在當前事務的各個語句之間更改數據,從而產生不可重復讀取和虛擬數據。 該選項是 SQL Server 的默認設置。
實際例子如下:
窗口1:

窗口2:

我們可以看到窗口1的同一個事務中讀取同一條數據前后會不一樣,導致了 不可重復讀取和虛擬數據
3. repeatable read(重復讀)
指定語句不能讀取已由其他事務修改但尚未提交的行,並且指定,其他任何事務都不能在當前事務完成之前修改由當前事務讀取的數據。
只需將 read committed 例子的 isolation level 改為 repeatable read 在執行就可以看出差別.修改等級后,更新操作必須等到第一個事務提交后才可執行
4.serializeable(可串行的)
-
-
語句不能讀取已由其他事務修改但尚未提交的數據。
-
任何其他事務都不能在當前事務完成之前修改由當前事務讀取的數據。
-
在當前事務完成之前,其他事務不能使用當前事務中任何語句讀取的鍵值插入新行。
-
| 隔離級別 | 臟讀 | 不可重復讀 | 虛擬讀取 |
|---|---|---|---|
| 未提交的讀取 | 是 | 是 | 是 |
| 已提交的讀取 | 否 | 是 | 是 |
| 可重復的讀取 | 否 | 否 | 是 |
| 快照 | 否 | 否 | 否 |
| 可序列化 | 否 | 否 | 否 |
