默认情况下,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. 【深度学习 有效炼丹】多GPU使用教程, DP与DDP对比, ray多线程并行处理等 [GPU利用率低的分析]

    ️ 前言 更新日志: 20220404:新增一个DDP 加载模型时显存分布不均问题,见目录遇到的问题及解决处 主要是上次server12 被自己一个train 直接线程全部拉满了(没错 ... ser ...

  2. 微信小程序day04基础加强

    一.自定义组件 1.1 组件的创建与引用 首先创建组件 然后我们组件的引用分为局部和全局引用 局部引用就是在当前页面能使用,在当前页面的json文件里面配置 全局引用同样的道理,注意跟page等是同级 ...

  3. 如何将自己的网站从 HTTP 的转换为 HTTPS 的

    1. 获取 SSL/TLS 证书 首先,你需要获得一个 SSL/TLS 证书.你可以从以下来源之一获取证书: 免费证书: Let's Encrypt:一个免费的.自动化的证书颁发机构(CA),广泛使用 ...

  4. 全网最适合入门的面向对象编程教程:14 类和对象的 Python 实现-类的静态方法和类方法,你分得清吗?

    全网最适合入门的面向对象编程教程:14 类和对象的 Python 实现-类的静态方法和类方法,你分得清吗? 摘要: 本文主要介绍了Python中类和对象中的类方法和静态方法,以及类方法和静态方法的定义 ...

  5. VS Code 开发统一代码格式化配置

    eslint: 是用来做代码风格检查的,比较关注代码质量,并且会提示不符合风格规范的代码,也有一部分代码格式化的功能.不是消除空行. "editor.formatOnSave": ...

  6. django信号中的条件判断不符合时如何提示错误并返回

    在Django中,如果你在信号(Signal)处理函数中需要进行条件判断,如果条件不符合,你可以触发一个异常,并在视图或其他地方捕获这个异常,然后返回相应的错误提示. 以下是一个简单的例子,演示如何在 ...

  7. vue3+elementplus 去除小数点后多余的0公用函数

    vue3+elementplus 去除小数点后多余的0公用函数 export function removeTrailingZeros(value) { // 尝试将值转换为数字 const nume ...

  8. Arch Linux install i3-wm

    Arch Linux install i3-wm 简介 i3-wm 是一种动态的平铺式窗口管理器,它的设计目标是提供一个快速.简洁.可定制的桌面环境,适合开发者和高级用户使用.它有以下几个特点: 它使 ...

  9. Python 正则表达式实战之Java日志解析

    需求描述 基于生产监控告警需求,需要对Java日志进行解析,提取相关信息,作为告警通知消息的内容部分. 提取思路 具体怎么提取,提取哪些内容呢?这里笔者分析了大量不同形态的生产日志,最后总结出4种形态 ...

  10. C# 通过反射(Reflection)调用不同名泛型方法

    概述 由于工作需要,需要通过数据类型和方法名控制方法走向 用到的数据类型有8种(string,Int16,Int32,Int64,Boolean,Byte,Single,Double) 读取的方法(参 ...