解决数据库并发读取错乱的途径之一就是使用事务进行操作,并且设置相应的事务隔离级别,现在就解释一下SQL Server的四种隔离级别。

SQL Server的四种隔离级别知识点整理,特别制作了流程图,方便以后查看!

SET TRANSACTION ISOLATION LEVEL
{

READ UNCOMMITTED

| READ COMMITTED

| REPEATABLE READ

| SERIALIZABLE

}

一、未提交读READ UNCOMMITTED(脏读)
意义:包含未提交数据的读。例如,在多用户环境下,用户B更改了某行。用户A在用户B提交更改之前读取已更改的行。如果此时用户B再回滚更改,则用户A便读取了逻辑上从未存在过的行。(如图演示)

演示:
1)用户B:
BEGIN TRAN
UPDATE test SET age=25 WHERE name = ‘AA’
2)用户A:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED(此句不写即默认为READ COMMITTED模式)
SELECT * FROM test(此时将查到AA的age值为25)
3)用户B:
ROLLBACK(此时撤消了步骤1的UPDATE操作,则用户A读到的错误数据被称为脏读)

二、提交读(READ COMMITTED)
意义:指定在读取数据时控制共享锁以避免脏读。此隔离等级的主要作用是避免脏读。
演示:
1)用户B:
BEGIN TRAN
UPDATE test SET age=25 WHERE name = ‘AA’
2)用户A:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SELECT * FROM test (上句设置了提交读模式,则此时将会查不到数据,显示查询等待中,直到用户B进行了ROLLBACK或者COMMIT操作后,此语句才会生效)

三、不一致的分析REPEATABLE READ(重复读)
意义:在多用户环境下,用户A开了一个事务,并且先对test表的某条记录做了查询(select * from test where name = ‘AA’),接着用户B对test表做了更新并提交(update test set age=25 where name=’AA’),这时A再去查test表中的这条记录,第一次读到的age值为12,第二次为25,两次读到的数据不一样,称之为重复读。(如图演 示)

解决办法:
在用户A的事务运行之前,先设定SQL的隔离等级为REPEATABLE READ
SQL语句为SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
这样在上图第一步中,用户A查询完之后,用户B将无法更新用户A所查询到的数据集中的任何数据(但是可以更新、插入和删除用户A查询到的数据集之外的数据),直到用户A事务结束才可以进行更新,这样就有效的防止了用户在同一个事务中读取到不一致的数据。

四、幻象(SERIALIZABLE)
意义:在多用户环境下,用户A开启了一个事务,并查询test表中的所有记录,然后用户B在自己的事务中插入(或删除)了test表中的一条记录并提交事务,此时用户A再去执行前面的查询整张表记录的操作,结果会多出(少了)一条记录,此操作称之为幻象。(如图演示)

解决办法:
在用户A的事务运行之前,先设定SQL的隔离等级为SERIALIZABLE
语句为SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
这样在用户A的事务执行过程中,别的用户都将无法对任何数据进行更新、插入和删除的操作,直到用户A的事务回滚或者提交为止。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。

转载于:https://www.cnblogs.com/wangzhanjianshe/archive/2011/06/21/2326422.html

sql server 隔离级别相关推荐

  1. 【概念原理】四种SQL事务隔离级别和事务ACID特性

    2019独角兽企业重金招聘Python工程师标准>>> 事务是一组读写操作,并且具有只有所有操作都成功才算成功的特性. 事务隔离级别 SQL事务隔离级别由弱到强分别是:READ_UN ...

  2. 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁

    阅读目录 概述: 一.事务 二.锁 三.阻塞 四.隔离级别 五.死锁 以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化.  本系列主要是针对T-SQL的总结. ...

  3. (4.12)全面解析-SQL事务+隔离级别+阻塞+死锁

    30分钟全面解析-SQL事务+隔离级别+阻塞+死锁 转自:https://blog.csdn.net/slowlifes/article/details/52752735 2016年10月07日 23 ...

  4. 翻译:SQL Server中的索引内部结构:到SQL Server索引级别10的阶梯。

    SQL Server中的索引内部结构:到SQL Server索引级别10的阶梯. 大卫•杜兰特2012/01/20 该系列 本文是楼梯系列的一部分:SQL Server索引的阶梯. 索引是数据库设计的 ...

  5. 翻译:集群索引:通往SQL Server索引级别3的阶梯

    集群索引:通往SQL Server索引级别3的阶梯 David Durant,2013/01/25(第一次出版:2011/06/22) 该系列 本文是楼梯系列的一部分:SQL Server索引的阶梯 ...

  6. 更深入到非聚集索引:通往SQL Server索引级别2的阶梯

    更深入到非聚集索引:通往SQL Server索引级别2的阶梯 大卫·杜兰特,2017/10/18(第一次出版:2014 /11/26) 该系列 本文是楼梯系列的一部分:SQL Server索引的阶梯 ...

  7. 数据库阻塞---SQL的隔离级别

    数据库的隔离级别主要是为读操作定义保护级别的:对于修改写操作,无论哪种隔离级别都可以保证写操作的正确执行.SQL标准为三种副作用: Dirty reads: 事务T2提交了数据,事务T1这时读取了T2 ...

  8. 阅读查询计划:楼梯SQL Server索引级别9

    通过大卫·杜兰特,2011/10/05 该系列 本文是楼梯系列的一部分:SQL Server的阶梯索引 索引数据库设计的基础,告诉开发人员使用数据库设计者的意图. 不幸的是索引时往往是后加上的性能问题 ...

  9. SQL Server实例级别迁移上云

    本文档介绍如何通过全量备份文件将自建SQL Server数据库的多个库或所有库全量迁移至阿里云RDS SQL Server. 前提条件 RDS实例为如下版本: RDS SQL Server集群系列(2 ...

最新文章

  1. 一文读懂微服务架构的重构策略
  2. vivo 互联网业务就近路由技术实战
  3. 苹果:高通的“非法行为”损害了整个行业
  4. c++ swap函数头文件_C++函数模板(泛型编程)
  5. c++调用gcd函数_c++函数库中一些实用的函数
  6. map集合的putall_Map.put和Map.putAll方法之间的区别?
  7. SQL Server 加密层级
  8. 发布一个mmap的trie_midrmm02_新浪博客
  9. php ajax实现上移,jquery实现标签上移、下移、置顶_jquery
  10. Fiddler模拟请求报文
  11. Python绘制美国队长盾牌
  12. 咬定青山不放松,立根原在破岩中。千磨万击还坚劲,任尔东南西北风!
  13. 【JSP课程设计】个人信息管理系统(代码保姆级)
  14. LINUX防御ssh远程暴力破解
  15. java第一周_从计算机基础到流程控制语句(if_else)
  16. 字节跳动二号人物——山西人张利东
  17. Office365 Word 打开某个文件就自动卡死关闭
  18. 《代码整洁之道》阅读笔记 4注释
  19. 决策树算法原理以及决策树规则生成方法
  20. 利用Linux宝塔界面搭建个不限速的网盘

热门文章

  1. sqlite 修改表名,合并数据库(文件)
  2. JavaMail发送简单邮件
  3. [代码]HDU 4335 What is N?
  4. 使用Capistrano向EC2部署Django代码--关于SSH相关的配置
  5. 【知识小课堂】 mongodb 之字段中的【 数组】、【内嵌文档】
  6. android打包apk时混淆遇到的问题
  7. Tomact和MySql搭建android简单服务器
  8. React的组件生命周期
  9. java.lang包—基本类型的封装类
  10. IDEA连接数据库自动生成实体类