首页 > 数据库 >关于SQLServer数据库的READ_COMMITTED_SNAPSHOT隔离级别

关于SQLServer数据库的READ_COMMITTED_SNAPSHOT隔离级别

时间:2024-05-20 18:08:12浏览次数:30  
标签:事务 读取 READ SQLServer SNAPSHOT COMMITTED 级别

默认情况下,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后,读取事务不再请求共享锁,而是访问一个数据行的快照版本,这个版本是在事务开始时就已经存在的数据状态。这种方式减少了锁的使用,从而提高了并发读取的性能。

主要优势

  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就能查到,并且可能把数据上送传入其他系统,但是如果那个事务最终并未提交呢?那上送的这种数据就是无头案了。【官方也不推荐这么使用】

标签:事务,读取,READ,SQLServer,SNAPSHOT,COMMITTED,级别
From: https://www.cnblogs.com/Nuwa/p/18202553

相关文章

  • [转] 整理一下SQLSERVER的排序规则
    原文链接:https://www.cnblogs.com/JimZhang/archive/2006/04/03/365573.htmlSQLSERVER的排序规则平时使用不是很多,也许不少初学者还比较陌生,但有一个错误大家应是经常碰到:SQLSERVER数据库,在跨库多表连接查询时,若两数据库默认字符集不同,系统就会返回这样的错误:“无法解决eq......
  • .NET6中使用Log4net记录日志(二)记录日志到SqlServer数据库
    1、引用NuGet包(System.Data.SqlClient) 2、创建SqlServer数据库表(ProgramLog)CREATETABLEProgramLog(IdINTIDENTITY(1,1)PRIMARYKEY,[Date]DATETIME,--记录时间[Level]NVARCHAR(128),--日志级别[RunTime]VARCHAR(128),--执行时长[Thread]NVARCHAR(256),--线程号[Lin......
  • SQLSERVER存储过程
    一、截取字符串第几个字符后的第几个元素CREATEfunctionfunc_StrSplitIndex(@strvarchar(1024),--要分割的字符串@splitvarchar(10),--分隔符号@indexint--取第几个元素)returnsvarchar(1024)asbegindeclare@locationintdeclare@startintdeclare@nex......
  • DataGridView 批量删除 SqlServer数据
    privatevoidbuttonDelete_Click(objectsender,EventArgse){DialogResult=MessageBox.Show("确定删除这些数据么?","提示",MessageBoxButtons.YesNo);List<int>list=newList<int>();if(DialogResult==DialogResult.Yes)......
  • SqlServer资料
    SqlServer内存资源释放   SqlServer内存会话连接   SqlServer连接池   SqlServer并行基础用法与常见问题   SQLServer创建索引   还原或删除数据独占访问权  比较char/varchar/nchar/nvarchar区别 还原失败System.Data.SqlClient.SqlError:无法执行BACK......
  • 当装饰者模式遇上Read Through缓存,一场技术的浪漫邂逅
    在《经验之谈:我为什么选择了这样一个激进的缓存大Key治理方案》一文中,我提到在系统中使用的缓存是旁路缓存模式,有读者朋友问,有没有用到过其他的缓存模式,本文将结合一个我曾经工作中的案例,使用装饰者模式实现ReadThrough缓存模式,助你轻松掌握设计模式和缓存。一、缓存模式不说废......
  • 配置SQLServer远程连接
    要在SQLServer上启用远程连接,需要执行以下步骤:1、确保SQLServer已启用远程连接:登录到SQLServer所在的计算机上。打开SQLServerManagementStudio(SSMS)。使用Windows身份验证或SQLServer身份验证登录SQLServer。在左侧的对象资源管理器中,右键单击服务......
  • pm_read pm_write实现
    实现read函数时不要忘记对齐,其中讲义提示:总是读取地址为raddr&~0x3u的4字节返回所以需要把读进来的地址进行&~0x3u,得到对齐后的地址,而后在把对齐后的物理地址转为虚拟地址guest_to_host(addr),最后进行组合就ok了,例如:地址:0x800000000x800000010x800000020x80......
  • rthread学习记录汇总-不断更新
    1、rthread同Linux类似,包含了所有主流的芯片、cpu架构,可从官方获取最新的rt-thread源码后进行裁剪 2、可从rthread官网下载env工具,env工具可用来对rtthread源码生成mdk/iar工程命令式scons--target=mdk5  scons--targe=iarscons自带的编译固件功能,命令为scnons,默认用......
  • PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
    参考:https://blog.csdn.net/jackbon8/article/details/1079406381.导出表格<?phpnamespaceapp#给类文件的命名空间起个别名usePhpOffice\PhpSpreadsheet\Spreadsheet;#Xlsx类将电子表格保存到文件usePhpOffice\PhpSpreadsheet\Writer\Xlsx;......