SQL Server 的 6 种隔离级别
背景知识:
高并发一直以来是数据的所追求的目标,然,一般事物是有两面性的。不多说了,等下变邪教了。下面直接看
并发性最高的隔离级别 read uncommitted
1、
read uncommitted 级别
比方这时有两个连接A,B;其中A想把表中的值由111改成222,表如下图

就在A改到一半的时B去读数据,结果看到的可能就是 211 这样的数据。这个隔离级别数据库的并发性是提高了,可是事务就不完整了。
它内部是用什么方式来提高并发的呢?
在这个隔离级别时读取数据是不用加锁的,也就是说B没有对资源加共享锁。这样就不会因为A在资源上
的排它锁而造成阻塞,有的人一定会问你不是说不用加锁吗?为什么会有排它锁,隔离级别是用来控制读
操作的,它不控制写操作,只是通过读操作影响写操作。
2、read committed 级别
它是SQL Server 的默认隔离级别,从锁的角度上来说,读完数据后就释放锁,不会一直持有锁到事务结束,它是问题是
如果在第一次读完数据后,别的连接又插入了新的数据,它再次去读(这两次读取是在同一个事务中的),读到的结果是不
一样的。
3、repeatable read 级别
它是在整个事务过程中,一直持有资源的锁,比如它读了第一行,它会在整个事务中一直持有第一行的共享锁。因为有共享
锁的存在所以就不会有让第二个连接去修改它读过的数据(要修改数据一定得到X锁,而资源上以有S锁了,上不了X锁)。
4、serializable 级别
这个直接说有点难懂,还是上例子吧:
比如有这么一个查询,它属于事务 A
Select * from Student where ID< 100;
.......................................
Select * from Student where ID< 100;
...................................... -- 这里是一些别的代码,所以说这是一个比较长的事务,它不只是只有一句select
我们假设表里只有一行,它的ID=1;在repeatable read级别下别人想在A执行的过程中去修改ID = 1 这行的值是
不可能的。原因上面说了,但是别的连接还是可以插入一个ID = 2的行。如果A再次读取时就会返回两行。
serializable 就不只是锁定ID = 1 的这一行了,它会锁定ID<100个个范围。这个别人想插入ID=2的行也就不行了
它解决了repeatable read 中的‘幻读’问题。
--------------------------------------------------------------------------------------------------------------------------------------------------
前四个都是通过对资源上怎么样的锁的方式,来实现各个事务的隔离的,下面要说的这两种方式,它不用锁,而是创建当前资源的复本(对资源进行复制)。
5 snapshot 级别
它保证读取的行是提交过的。读完后自己复制一份,以后自己就用这个复本。所以它可以实现可重复读(repeatable read),也就是说
别人都更新了,它还是读自己的久版本。
6 read committed snapshot 级别
它读取的数据不是事务启动前最后提交的版本,而是语句启动前最后提交的行。这样就不用都是读自己的久版本了。
总结:
说了这么多还没有告诉大家怎么进行设置。
第一大类、
也就是前四种的设置方法是
1、 连接级 set transaction isolation level read committed | read uncommitted | repeatable read | serializable
2、 单个查询级 select ... from table_Name with(isolationName)
例子:
select * from myTable with(readCommitted);
看到没有这里的isolationName 是‘readcommitted' 不是 'read committed'区别在于它没有空格!
第二大类、
后两种
alter database DBName set allow_snapshot_isolation off|on;
alter database DBName set read_committed_snapshot off|on;
SQL Server 的 6 种隔离级别的更多相关文章
- SQL Server 之 事务与隔离级别实例讲解
SQL Server 之 事务与隔离级别实例讲解 SQL Server 实现了6个隔离级别来防止并发情况下,类似企图并发的访问或修改同一数据时问题的发生.本文将带你体验全部6个隔离级别.正如你接下来将 ...
- Sql Server中的事务隔离级别
数据库中的事物有ACID(原子性,一致性,隔离性,持久性)四个特性.其中隔离性是用来处理并发执行的事务之间的数据访问控制.SqlServer中提供了几种不同级别的隔离类型. 概念 Read UnCom ...
- 查看SQL Server当前会话的隔离级别
查看SQL Server当前会话的隔离级别 DBCC USEROPTIONS
- 【转修正】sql server行版本控制的隔离级别
在SQL Server标准的已提交读(READ COMMITTED)隔离级别下,一个读操作会和一个写操作相互阻塞.未提交读(READ UNCOMMITTED)虽然不会有这种阻塞,但是读操作可能会读到脏 ...
- sql 事务的四种隔离级别
在 SQL 标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的.较低级别的隔离通常可以执行更高的并发,系统的开销也更低. read unco ...
- SQL事务的四种隔离级别和MySQL多版本并发控制
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的那些改变时可见的,那些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. ReadUncommitted( ...
- 浅析SQL Server在可序列化隔离级别下,防止幻读的范围锁的锁定问题
本文出处:http://www.cnblogs.com/wy123/p/7501261.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...
- SQL事务的四种隔离级别
1未提交读(Read uncommitted):完全不锁表,所以会出现脏数据.2提交读(Read committed):1.事务1中update才锁表,可以select到最新数据. 事务2select ...
- SQL Server事务的四种隔离级别
在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些是在事务内和事务间可见的,哪些是不可见的.较低级别的隔离通常可以执行更高的并发,系统的开销也更低. 1.未提交读(Read ...
随机推荐
- 重读LPTHW-Lesson18-21 函数
1.def 定义函数,选取合适的函数名,原则是易于理解.阅读.函数名格式与变量命名格式相同,以字母开始,可以包含字母.数字.下划线.函数命名后,把参数放在()中,可以无参数.然后:结束函数命名,开始函 ...
- Win7/Win8 系统下安装Oracle 10g 提示“程序异常终止,发生未知错误”的解决方法
我的Oracle 10g版本是10.2.0.1.0,(10.1同理)选择高级安装,提示“程序异常终止,发生未知错误”. 1.修改Oracle 10G\database\stage\prereq\db\ ...
- Taglib、EL、OGNL
Taglib.EL.OGNL 阅读目录 1. Taglib(tag library) 标签库 2. EL(Expression Language) 表达式 3. OGNL(Object-Graph N ...
- 深入了解三种针对文件(JSON、XML与INI)的配置源
深入了解三种针对文件(JSON.XML与INI)的配置源 物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonCon ...
- iOS开发多线程-线程间通讯
一.NSThread 线程间的通讯 - (void)demoAboutNSThread { NSLog(@"demoAboutNSThread %@", [NSThread cur ...
- SQL Server索引设计 <第五篇>
SQL Server索引的设计主要考虑因素如下: 检查WHERE条件和连接条件列: 使用窄索引: 检查列的选择性: 检查列的数据类型: 考虑列顺序: 考虑索引类型(聚集索引OR非聚集索引): 一.检查 ...
- UESTC_吴队长征婚 2015 UESTC Training for Search Algorithm & String<Problem E>
E - 吴队长征婚 Time Limit: 10000/4000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- Java菜鸟学习笔记--数组篇(三):二维数组
定义 //1.二维数组的定义 //2.二维数组的内存空间 //3.不规则数组 package me.array; public class Array2Demo{ public static void ...
- java提高篇(二二)-----LinkedList
摘自http://blog.csdn.net/chenssy/article/details/18099417 java提高篇(二二)-----LinkedList 一.概述 LinkedList与 ...
- mvc 日历控件
第二个是日历控件,在网上查了一个普通的日历控件,也生成了下拉的日历样子,但是一些脚本比如选择年月,需要一些时间,最后只好套用了My97 DatePicker,这样以来其实简单多了. 第一步:下载 My ...