来自https://technet.microsoft.com/zh-cn/library/ms189122(v=sql.105).aspx
# 数据库引擎中的隔离级别
其他版本
![](https://i-technet.sec.s-msft.com/Areas/Epx/Content/Images/ImageSprite.png?v=636366940422435367)
事务指定一个隔离级别,该隔离级别定义一个事务必须与其他事务所进行的资源或数据更改相隔离的程度。隔离级别从允许的并发副作用(例如,脏读或幻读)的角度进行描述。
事务隔离级别控制:
* 读取数据时是否占用锁以及所请求的锁类型。
* 占用读取锁的时间。
* 引用其他事务修改的行的读取操作是否:
* 在该行上的排他锁被释放之前阻塞其他事务。
* 检索在启动语句或事务时存在的行的已提交版本。
* 读取未提交的数据修改。
选择事务隔离级别不影响为保护数据修改而获取的锁。事务总是在其修改的任何数据上获取排他锁并在事务完成之前持有该锁,不管为该事务设置了什么样的隔离级别。对于读取操作,事务隔离级别主要定义保护级别,以防受到其他事务所做更改的影响。
较低的隔离级别可以增强许多用户同时访问数据的能力,但也增加了用户可能遇到的并发副作用(例如脏读或丢失更新)的数量。相反,较高的隔离级别减少了用户可能遇到的并发副作用的类型,但需要更多的系统资源,并增加了一个事务阻塞其他事务的可能性。应平衡应用程序的数据完整性要求与每个隔离级别的开销,在此基础上选择相应的隔离级别。最高隔离级别(可序列化)保证事务在每次重复读取操作时都能准确检索到相同的数据,但需要通过执行某种级别的锁定来完成此操作,而锁定可能会影响多用户系统中的其他用户。最低隔离级别(未提交读)可以检索其他事务已经修改、但未提交的数据。在未提交读中,所有并发副作用都可能发生,但因为没有读取锁定或版本控制,所以开销最少。
##
数据库引擎隔离级别
[](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 语句修改。这是不允许的,因为未对元数据进行版本控制。如果与快照隔离混合,对元数据的并发更新可能导致不一致。”
下表显示了不同隔离级别导致的并发副作用。
![](https://box.kancloud.cn/0fe85e97c04de827a03ef2f306576327_413x266.png)
有关每个事务隔离级别控制的特定类型的锁或行版本控制的详细信息,请参阅[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分析和设计(二)
- 数据库命名规范--通用