关于SQLServer数据库的READ_COMMITTED_SNAPSHOT隔离级别
默认情况下,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
主要优势
- 减少锁争用:由于不加锁读取,大大降低了并发事务之间的锁等待和阻塞,提高了系统的吞吐量。
- 非阻塞读取:即使其他事务正在修改数据,读取事务也能顺利进行,不会被阻塞。
- 简化编程模型:对于开发者来说,可以减少因锁定引发的异常处理逻辑,使得应用程序编写更加简单。
潜在影响
- tempdb使用增加:快照数据存储在
tempdb中,因此tempdb的大小和I/O负载可能会显著增加。 - 存储和内存需求上升:维护行版本会占用更多的存储空间和内存资源。
- 可能的数据不一致性:尽管名为“读已提交”,但实际读取的是事务开始时刻的数据快照,因此在高并发写入场景下,可能无法反映最新数据状态。
- 性能考量:对于写密集型应用,启用
READ_COMMITTED_SNAPSHOT可能不如预期那样提升性能,因为额外的版本管理操作会带来开销。
官方文档链接
推荐直接参考微软官方文档:
结论
READ_COMMITTED_SNAPSHOT隔离级别是提升并发读取性能的有效手段,特别是在读多写少的应用场景中。然而,它的采用需权衡利弊,特别是对tempdb的管理和监控,以及对数据一致性的理解和接受程度。在决定启用此选项之前,应充分评估系统的特定需求、资源限制和业务逻辑,以确保最佳的性能与数据完整性平衡。
另外,不推荐在代码中使用select xx,oo from table_n(nolock)这种东西,也就是不要随便使用NOLock,官方也不推荐这么使用,除非你能接受它带来的负面影响,一句话它是脏读:读未提交的数据。一个事务正在修改,还未提交,另一个事务使用nolock就能查到,并且可能把数据上送传入其他系统,但是如果那个事务最终并未提交呢?那上送的这种数据就是无头案了。【官方也不推荐这么使用】
关于SQLServer数据库的READ_COMMITTED_SNAPSHOT隔离级别的更多相关文章
- 数据库的快照隔离级别(Snapshot Isolation)
隔离级别定义事务处理数据读取操作的隔离程度,在SQL Server中,隔离级别只会影响读操作申请的共享锁(Shared Lock),而不会影响写操作申请的互斥锁(Exclusive Lock),隔离级 ...
- MySQL数据库事务各隔离级别加锁情况--read uncommitted篇(转)
本文转自https://m.imooc.com/article/details?article_id=17291,感谢作者 1.目的 1.1 合适人群 1.数据库事务特征我只是背过,并没有很深刻的理解 ...
- 转:数据库的快照隔离级别(Snapshot Isolation)
数据库的快照隔离级别(Snapshot Isolation) 隔离级别定义事务处理数据读取操作的隔离程度,在SQL Server中,隔离级别只会影响读操作申请的共享锁(Shared Lock),而 ...
- 数据库ACID、隔离级别与MVCC
首先需要明确事务的概念:一组原子性的SQL查询,如果数据库引擎能够成功的对数据库应用该组查询的全部语句,那么就执行该组语句,否则所有语句都不执行. 事务有ACID四个特性,即: 原子性:一个事务是一个 ...
- 「DB」数据库事务的隔离级别
*博客搬家:初版发布于 2017/04/10 00:37 原博客地址:https://my.oschina.net/sunqinwen/blog/875833 数据库事务的隔离级别 讲事务的隔离 ...
- Mysql数据库事务的隔离级别和锁的实现原理分析
Mysql数据库事务的隔离级别和锁的实现原理分析 找到大神了:http://blog.csdn.net/tangkund3218/article/details/51753243 InnoDB使用MV ...
- MySQL数据库的事物隔离级别
一. 查看数据库的事物隔离级别 mysql> show variables like '%isolation'; +-----------------------+--------------- ...
- Spring中事务的传播行为,7种事务的传播行为,数据库事务的隔离级别
Propagation.REQUIRED 代表当前方法支持当前的事务,且与调用者处于同一事务上下文中,回滚统一回滚(如果当前方法是被其他方法调用的时候,且调用者本身即有事务),如果没有事务,则自己新建 ...
- 设置SQLServer的行版本控制隔离级别
1.--查询数据库状态 select name,user_access,user_access_desc,snapshot_isolation_state,snapshot_isolation_sta ...
- SqlServer中的事务隔离级别、锁机制
事务 作用:用来执行一连串的动作,并且保证所有动作要么都执行.要么都不执行. 属性:原子行.一致性.隔离性.持久性 锁 作用:SqlServer使用锁来实施事务隔离属性. 阻塞 定义:如果一个事务持有 ...
随机推荐
- Vue 处理异步加载顺序问题:在Konva中确保文本在图片之上显示
Vue 处理异步加载顺序问题:在Konva中确保文本在Konva之上显示 在使用Konva开发应用时,我们经常会遇到需要将文本绘制在图片之上的情况.一个常见的问题是,由于图像加载是异步的,文本有时会显 ...
- 说说你对 SPA 单页面的理解,它的优缺点分别是什么?
SPA( single-page application )仅在 Web 页面初始化时加载相应的 HTML.JavaScript 和 CSS. 一旦页> 面加载完成,SPA 不会因为用户的操作而 ...
- 实用!一键生成数据库文档的神器,支持MySQL/SqlServer/Oracle多种数据库
Screw(螺丝钉)是一款简洁好用的数据库表结构文档生成工具,它的特点是:简洁.轻量.设计良好.多数据库支持.多种格式文档.灵活扩展以及支持自定义模板,对于有经常要进行数据库设计.评审.文档整理等需求 ...
- jQuery中hide()和display的区别在于它们实现元素隐藏的方式不同。
1. hide()方法是jQuery提供的一个函数,用于隐藏元素.当使用hide()方法时,元素会被设置为display:none,即不显示在页面上,但仍然占据着原来的空间.隐藏后的元素可以通过调用s ...
- System.NotSupportedException:“无法显式设置 SplitterPanel 的高度。改在 SplitContainer 上设置 SplitterDistance。”
System.NotSupportedException:"无法显式设置 SplitterPanel 的高度.改在 SplitContainer 上设置 SplitterDistance.& ...
- Docker Engine在Centos下的安装
实践环境 Centos7.8 先决条件 CentOS 7.8. 必须开启 centos-extrasyum仓库源.默认是开启的,如果关闭了,需要重新开启,如下 编辑 /etc/yum.repos.d/ ...
- 一款.NET开源、跨平台的DASH/HLS/MSS下载工具
前言 今天大姚给大家分享一款.NET开源(MIT License).免费.跨平台的DASH/HLS/MSS下载工具,并且支持点播和直播(DASH/HLS)的内容下载:N_m3u8DL-RE. 网络流媒 ...
- redis环境的安装
Redis环境的安装(源码安装),主要分为单机安装与集群安装,无论是单机安装还是集群安装,Redis本身的依赖是必须要有的,本文所采用的Redis版本是redis-5.0.3,所需要的依赖如下: cp ...
- 【PHP】5版本 过程式操作MySQL
建立连接和释放连接: # 连接参数 $sever = 'localhost:3309'; $username = 'root'; $password = 'root'; # 调用连接方法,如果失败结束 ...
- 【Maxwell】02 Kafka配置
一.快速搭建Kafka环境 基于Docker容器创建(供参考): https://www.cnblogs.com/mindzone/p/15608984.html 这里简要写一下命令: # 拉取zk ...