ISO 標准定義了下列隔離級別,SQL Server 資料庫引擎支持所有這些隔離級別: 未提交讀(隔離事務的最低級別,只能保證不讀取物理上損壞的數據) 已提交讀(資料庫引擎的預設級別) 可重覆讀 可序列化(隔離事務的最高級別,事務之間完全隔離) SQL Server 還支持使用行版本控制的兩個事務隔 ...
ISO 標准定義了下列隔離級別,SQL Server 資料庫引擎支持所有這些隔離級別:
- 未提交讀(隔離事務的最低級別,只能保證不讀取物理上損壞的數據)
- 已提交讀(資料庫引擎的預設級別)
- 可重覆讀
- 可序列化(隔離事務的最高級別,事務之間完全隔離)
SQL Server 還支持使用行版本控制的兩個事務隔離級別。一個是已提交讀隔離的新實現,另一個是新事務隔離級別(快照)。
- 當 READ_COMMITTED_SNAPSHOT 資料庫選項設置為 ON 時,已提交讀隔離使用行版本控制提供語句級讀取一致性。讀取操作只需要
SCH-S 表級別的鎖,不需要頁鎖或行鎖。當 READ_COMMITTED_SNAPSHOT 資料庫選項設置為
OFF(預設設置)時,已提交讀隔離的行為方式與其在早期版本 SQL Server 中行為方式相同。兩個實現都滿足已提交讀隔離的 ANSI 定義。
- 快照隔離級別使用行版本控制來提供事務級別的讀取一致性。讀取操作不獲取頁鎖或行鎖,只獲取 SCH-S
表鎖。讀取其他事務修改的行時,讀取操作將檢索啟動事務時存在的行的版本。將 ALLOW_SNAPSHOT_ISOLATION 資料庫選項設置為 ON
時,將啟用快照隔離。預設情況下,用戶資料庫的此選項設置為 OFF。
註意: |
---|
SQL Server 不支持元數據的版本控制。因此,對於在快照隔離下運行的顯式事務中可以執行的 DDL 操作存在限制。在快照隔離下,BEGIN TRANSACTION 語句之後不允許使用任何公共語言運行時 (CLR) DDL 語句或下列 DDL 語句:ALTER TABLE、CREATE INDEX、CREATE XML INDEX、ALTER INDEX、DROP INDEX、DBCC REINDEX、ALTER PARTITION FUNCTION、ALTER PARTITION SCHEME。在隱式事務中使用快照隔離時允許使用這些語句。根據定義,隱式事務為單個語句,這使得它可以強制應用快照隔離的語義,即便使用 DDL 語句也是如此。違反此原則會導致錯誤 3961:“資料庫 '%.*ls' 中的快照隔離事務失敗,因為自此事務啟動後,該語句所訪問的對象已由其他併發事務中的 DDL 語句修改。這是不允許的,因為未對元數據進行版本控制。如果與快照隔離混合,對元數據的併發更新可能導致不一致。” |
下表顯示了不同隔離級別導致的併發副作用。
隔離級別 | 臟讀 | 不可重覆讀 | 幻讀 |
---|---|---|---|
未提交讀 |
是 |
是 |
是 |
已提交讀 |
否 |
是 |
是 |
可重覆讀 |
否 |
否 |
是 |
快照 |
否 |
否 |
否 |
可序列化 |
否 |
否 |
否 |
有關每個事務隔離級別控制的特定類型的鎖或行版本控制的詳細信息,請參閱SET TRANSACTION ISOLATION LEVEL (Transact-SQL)。