來自https://technet.microsoft.com/zh-cn/library/ms189122(v=sql.105).aspx
# 數據庫引擎中的隔離級別
其他版本

事務指定一個隔離級別,該隔離級別定義一個事務必須與其他事務所進行的資源或數據更改相隔離的程度。隔離級別從允許的并發副作用(例如,臟讀或幻讀)的角度進行描述。
事務隔離級別控制:
* 讀取數據時是否占用鎖以及所請求的鎖類型。
* 占用讀取鎖的時間。
* 引用其他事務修改的行的讀取操作是否:
* 在該行上的排他鎖被釋放之前阻塞其他事務。
* 檢索在啟動語句或事務時存在的行的已提交版本。
* 讀取未提交的數據修改。
選擇事務隔離級別不影響為保護數據修改而獲取的鎖。事務總是在其修改的任何數據上獲取排他鎖并在事務完成之前持有該鎖,不管為該事務設置了什么樣的隔離級別。對于讀取操作,事務隔離級別主要定義保護級別,以防受到其他事務所做更改的影響。
較低的隔離級別可以增強許多用戶同時訪問數據的能力,但也增加了用戶可能遇到的并發副作用(例如臟讀或丟失更新)的數量。相反,較高的隔離級別減少了用戶可能遇到的并發副作用的類型,但需要更多的系統資源,并增加了一個事務阻塞其他事務的可能性。應平衡應用程序的數據完整性要求與每個隔離級別的開銷,在此基礎上選擇相應的隔離級別。最高隔離級別(可序列化)保證事務在每次重復讀取操作時都能準確檢索到相同的數據,但需要通過執行某種級別的鎖定來完成此操作,而鎖定可能會影響多用戶系統中的其他用戶。最低隔離級別(未提交讀)可以檢索其他事務已經修改、但未提交的數據。在未提交讀中,所有并發副作用都可能發生,但因為沒有讀取鎖定或版本控制,所以開銷最少。
##
數據庫引擎隔離級別
[](https://technet.microsoft.com/zh-cn/library/ms189122(v=sql.105).aspx#Anchor_0 "右鍵單擊以復制并共享此部分的鏈接")
ISO 標準定義了下列隔離級別,SQL Server 數據庫引擎支持所有這些隔離級別:
* 未提交讀(隔離事務的最低級別,只能保證不讀取物理上損壞的數據)
* 已提交讀(數據庫引擎的默認級別)
* 可重復讀
* 可序列化(隔離事務的最高級別,事務之間完全隔離)
**重要提示**
在請求可序列化隔離級別時,復制的表上的 DDL 操作和事務可能失敗。這是因為復制查詢使用的提示可能與可序列化隔離級別不兼容。
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)](https://technet.microsoft.com/zh-cn/library/ms173763(v=sql.105).aspx)。
##
請參閱
[](https://technet.microsoft.com/zh-cn/library/ms189122(v=sql.105).aspx#Anchor_1 "右鍵單擊以復制并共享此部分的鏈接")
#### 參考
[ALTER DATABASE (Transact-SQL)](https://technet.microsoft.com/zh-cn/library/ms174269(v=sql.105).aspx)
#### 概念
[并發影響](https://technet.microsoft.com/zh-cn/library/ms190805(v=sql.105).aspx)
[并發控制的類型](https://technet.microsoft.com/zh-cn/library/ms189132(v=sql.105).aspx)
- 數據庫
- CAP定理
- 關系模型
- 關系數據庫
- NoSQL
- ODBC
- JDBC
- ODBC、JDBC和四種驅動類型
- mysql
- 安裝與配置
- CentOS 7 安裝 MySQL
- 優化
- 比較全面的MySQL優化參考
- 1、硬件層相關優化
- 1.1、CPU相關
- 1.2、磁盤I/O相關
- 2、系統層相關優化
- 2.1、文件系統層優化
- 2.2、其他內核參數優化
- 3、MySQL層相關優化
- 3.1、關于版本選擇
- 3.2、關于最重要的參數選項調整建議
- 3.3、關于Schema設計規范及SQL使用建議
- 3.4、其他建議
- 后記
- Mysql設計與優化專題
- ER圖,數據建模與數據字典
- 數據中設計中的范式與反范式
- 字段類型與合理的選擇字段類型
- 表的垂直拆分和水平拆分
- 詳解慢查詢
- mysql的最佳索引攻略
- 高手詳解SQL性能優化十條經驗
- 優化SQL查詢:如何寫出高性能SQL語句
- MySQL索引原理及慢查詢優化
- 數據庫SQL優化大總結之 百萬級數據庫優化方案
- 數據庫性能優化之SQL語句優化1
- 【重磅干貨】看了此文,Oracle SQL優化文章不必再看!
- MySQL 對于千萬級的大表要怎么優化?
- MySQL 數據庫設計總結
- MYSQL性能優化的最佳20+條經驗
- 數據操作
- 數據語句操作類型
- DCL
- 修改Mysql數據庫名的5種方法
- DML
- 連接
- 連接2
- DDL
- 數據類型
- 字符集
- 表引擎
- 索引
- MySQL理解索引、添加索引的原則
- mysql建索引的幾大原則
- 淺談mysql的索引設計原則以及常見索引的區別
- 常用工具簡介
- QA
- MySQL主機127.0.0.1與localhost區別總結
- 視圖(view)
- 觸發器
- 自定義函數和存儲過程的使用
- 事務(transaction)
- 范式與反范式
- 常用函數
- MySQL 數據類型 詳解
- Mysql數據庫常用分庫和分表方式
- 隔離級別
- 五分鐘搞清楚MySQL事務隔離級別
- mysql隔離級別及事務傳播
- 事務隔離級別和臟讀的快速入門
- 數據庫引擎中的隔離級別
- 事務隔離級別
- Innodb中的事務隔離級別和鎖的關系
- MySQL 四種事務隔離級的說明
- Innodb鎖機制:Next-Key Lock 淺談
- SQL函數和存儲過程的區別
- mongo
- MongoDB設置訪問權限、設置用戶
- redis
- ORM
- mybatis
- $ vs #
- mybatis深入理解(一)之 # 與 $ 區別以及 sql 預編譯
- 電商設計
- B2C電子商務系統研發——概述篇
- B2C電子商務系統研發——商品數據模型設計
- B2C電子商務系統研發——商品模塊E-R圖建模
- B2C電子商務系統研發——商品SKU分析和設計(一)
- B2C電子商務系統研發——商品SKU分析和設計(二)
- 數據庫命名規范--通用