默认情况下,SQL Server的事务隔离级别是READ COMMITED。刚开始我理解这个模式就是读已经提交的,那也就是说并发一个事务去更新,一个事务查询同一条数据应该是像Mysql、Oracle不会加锁直接返回数据库已经提交的数据才对。但是SQL Server不是这样的。

SQLServer中有READ_COMMITTED_SNAPSHOT,这个才不会对读加锁,直接读取提交的快照。

事务隔离级别是确保数据一致性和并发控制的重要机制。SQL Server 提供了多种事务隔离级别,其中READ_COMMITTED_SNAPSHOT(读已提交快照)是一个特别值得注意的选项,它在提高并发读取性能的同时,也带来了一些独特的特性和考量。本文将详细探讨READ_COMMITTED_SNAPSHOT的作用、优势、潜在影响及配置建议,并附上官方文档链接,以供深入学习。

什么是READ_COMMITTED_SNAPSHOT?

READ_COMMITTED_SNAPSHOT隔离级别是SQL Server中的一种事务处理模式,它改变了传统的READ_COMMITTED隔离级别下读取数据的方式。在标准的READ_COMMITTED级别,读取操作会加上锁来阻止其他事务修改正在读取的数据,这可能导致锁争用,影响并发性能。而启用READ_COMMITTED_SNAPSHOT后,读取事务不再请求共享锁,而是访问一个数据行的快照版本,这个版本是在事务开始时就已经存在的数据状态。这种方式减少了锁的使用,从而提高了并发读取的性能。

启用和禁用READ_COMMITTED以及SNAPSHOT

注意这里是全局设置,不是只针对当前事务

启用:

ALTER DATABASE 数据库名 SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

ALTER DATABASE 数据库名 SET READ_COMMITTED_SNAPSHOT ON;

ALTER DATABASE 数据库名 SET MULTI_USER;


禁用,恢复到默认(READ COMMITED):

ALTER DATABASE 数据库名 SET SINGLE_USER WITH ROLLBACK IMMEDIATE; ALTER DATABASE 数据库名 SET READ_COMMITTED_SNAPSHOT OFF; ALTER DATABASE 数据库名 SET MULTI_USER;


查询当前数据库隔离级别:DBCC USEROPTIONS

主要优势

  1. 减少锁争用:由于不加锁读取,大大降低了并发事务之间的锁等待和阻塞,提高了系统的吞吐量。
  2. 非阻塞读取:即使其他事务正在修改数据,读取事务也能顺利进行,不会被阻塞。
  3. 简化编程模型:对于开发者来说,可以减少因锁定引发的异常处理逻辑,使得应用程序编写更加简单。

潜在影响

  1. tempdb使用增加:快照数据存储在tempdb中,因此tempdb的大小和I/O负载可能会显著增加。
  2. 存储和内存需求上升:维护行版本会占用更多的存储空间和内存资源。
  3. 可能的数据不一致性:尽管名为“读已提交”,但实际读取的是事务开始时刻的数据快照,因此在高并发写入场景下,可能无法反映最新数据状态。
  4. 性能考量:对于写密集型应用,启用READ_COMMITTED_SNAPSHOT可能不如预期那样提升性能,因为额外的版本管理操作会带来开销。

官方文档链接

推荐直接参考微软官方文档:

结论

READ_COMMITTED_SNAPSHOT隔离级别是提升并发读取性能的有效手段,特别是在读多写少的应用场景中。然而,它的采用需权衡利弊,特别是对tempdb的管理和监控,以及对数据一致性的理解和接受程度。在决定启用此选项之前,应充分评估系统的特定需求、资源限制和业务逻辑,以确保最佳的性能与数据完整性平衡。

另外,不推荐在代码中使用select xx,oo from table_n(nolock)这种东西,也就是不要随便使用NOLock,官方也不推荐这么使用,除非你能接受它带来的负面影响,一句话它是脏读:读未提交的数据。一个事务正在修改,还未提交,另一个事务使用nolock就能查到,并且可能把数据上送传入其他系统,但是如果那个事务最终并未提交呢?那上送的这种数据就是无头案了。【官方也不推荐这么使用】

关于SQLServer数据库的READ_COMMITTED_SNAPSHOT隔离级别的更多相关文章

  1. 数据库的快照隔离级别(Snapshot Isolation)

    隔离级别定义事务处理数据读取操作的隔离程度,在SQL Server中,隔离级别只会影响读操作申请的共享锁(Shared Lock),而不会影响写操作申请的互斥锁(Exclusive Lock),隔离级 ...

  2. MySQL数据库事务各隔离级别加锁情况--read uncommitted篇(转)

    本文转自https://m.imooc.com/article/details?article_id=17291,感谢作者 1.目的 1.1 合适人群 1.数据库事务特征我只是背过,并没有很深刻的理解 ...

  3. 转:数据库的快照隔离级别(Snapshot Isolation)

    数据库的快照隔离级别(Snapshot Isolation)   隔离级别定义事务处理数据读取操作的隔离程度,在SQL Server中,隔离级别只会影响读操作申请的共享锁(Shared Lock),而 ...

  4. 数据库ACID、隔离级别与MVCC

    首先需要明确事务的概念:一组原子性的SQL查询,如果数据库引擎能够成功的对数据库应用该组查询的全部语句,那么就执行该组语句,否则所有语句都不执行. 事务有ACID四个特性,即: 原子性:一个事务是一个 ...

  5. 「DB」数据库事务的隔离级别

    *博客搬家:初版发布于 2017/04/10 00:37    原博客地址:https://my.oschina.net/sunqinwen/blog/875833 数据库事务的隔离级别 讲事务的隔离 ...

  6. Mysql数据库事务的隔离级别和锁的实现原理分析

    Mysql数据库事务的隔离级别和锁的实现原理分析 找到大神了:http://blog.csdn.net/tangkund3218/article/details/51753243 InnoDB使用MV ...

  7. MySQL数据库的事物隔离级别

    一. 查看数据库的事物隔离级别 mysql> show variables like '%isolation'; +-----------------------+--------------- ...

  8. Spring中事务的传播行为,7种事务的传播行为,数据库事务的隔离级别

    Propagation.REQUIRED 代表当前方法支持当前的事务,且与调用者处于同一事务上下文中,回滚统一回滚(如果当前方法是被其他方法调用的时候,且调用者本身即有事务),如果没有事务,则自己新建 ...

  9. 设置SQLServer的行版本控制隔离级别

    1.--查询数据库状态 select name,user_access,user_access_desc,snapshot_isolation_state,snapshot_isolation_sta ...

  10. SqlServer中的事务隔离级别、锁机制

    事务 作用:用来执行一连串的动作,并且保证所有动作要么都执行.要么都不执行. 属性:原子行.一致性.隔离性.持久性 锁 作用:SqlServer使用锁来实施事务隔离属性. 阻塞 定义:如果一个事务持有 ...

随机推荐

  1. mermaid语法画图

    mermaid 脚本语言 graph TB 从上到下 graph BT 从下到上 graph RL 从右到左 graph LR 从左到右 graph LR; A001-->B001; graph ...

  2. Oracle 启用、禁用触发器

    基本语法 启用指定表中所有触发器(trigger) alter table table_name enable all triggers; 语法: alter table 表名 enable all ...

  3. 动手学深度学习——CNN应用demo

    CNN应用demo CNN实现简单的手写数字识别 import torch import torch.nn.functional as F from torchvision import datase ...

  4. 妙趣横生:利用Echarts实现SpreadJS引用从属关系的可视化魅力

    最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/ 在金融行业,我们经常会有审计审查的需求,对某个计算结果进行审查,但是这个计算结果可能依赖多个单 ...

  5. 27 首页banner文库失效

    安卓app 首页banner文库没有连接功能

  6. [oeasy]python0117 文字的演化_埃及圣书体_象形文字_楔形文字

    埃及圣书体 回忆上次内容 两河流域 苏美尔文明 所使用的 楔形文字 不是象形文字     ​   添加图片注释,不超过 140 字(可选)   楔形文字的字型 究竟是怎么来的呢?   巴别塔 苏美尔的 ...

  7. python 列表append和 的区别??

    python列表中的合并 python列表中append方法是给列表增加一个元素,而'+='是增加上该符号后边的元素,类似于extend方法 不知道对错,先记下来.我学的append方法是在列表最后追 ...

  8. 记录荒废了三年的四年.net开发的第二次面试(进复试了)

    这次面试的是小公司,深圳计通智能,面试分为初试和复试.使用腾讯视频会议完成.相比与上次面试,这次有所进步,进复试了.当然,这可能也与面试风格有关.这次面试着重与项目经历和技术,因此回答比较顺畅. 这一 ...

  9. HPA* (Near Optimal hierarchical Path-finding)算法的效果演示视频

    地址: https://www.youtube.com/watch?v=vtps41xEBU4

  10. 域名所有权验证 —— DNS TXT 域名验证

    参考: https://help.aliyun.com/zh/cdn/getting-started/verify-the-ownership-of-a-domain-name https://blo ...