热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

序列化隔离级别Key-Range锁定的真实键范围

大家都知道在序列化隔离级别中引入了键范围锁定。键范围锁可防止其他事务插入其键值位于可序列化事务读取的键值范围内的新行,从而确保满足此要求。但是对于锁定

大家都知道在序列化隔离级别中引入了键范围锁定。键范围锁可防止其他事务插入其键值位于可序列化事务读取的键值范围内的新行,从而确保满足此要求。但是对于锁定

大家都知道在序列化隔离级别中引入了键范围锁定。键范围锁可防止其他事务插入其键值位于可序列化事务读取的键值范围内的新行,从而确保满足此要求。但是对于锁定的范围真的清楚吗?


前几天看到有人对于锁范围的疑问,发现锁定的数据比想象的要多。


下面我们看个例子:
---create tableand insert test data
CREATE TABLE TEST(C1INTprimary key,C2VARCHAR(20))
INSERT INTO testVALUES(1,'TEST'),(2,'TEST'),(3,'EST')
--第一个窗口查询执行


SET TRANSACTIONISOLATIONLEVELSERIALIZABLE
BEGIN TRAN
SELECT * FROM test WHERE C1 BETWEEN 1 AND 3
--第二个窗口查询执行
INSERT INTO testVALUES(100,'TEST')


按照一般的理解,Rang锁应该会锁定1-3的数据,不允许对其中的数据进行任何修改,所以插入100应该是可以正常执行的。 但是插入100的进程一直被Block无法执行。


通过sys.dm_tran_locks的resource_description字段我们可以看到“ffffffffffff”,也就是说它的键范围锁是1,2,3到无穷大,而并不少单纯的1,2,3。这个跟我们平常所理解的Rang范围有冲突了。


查看MSDN有一个 注意:包含的RangeS-S锁数量为n+1,此处n是满足查询条件的行数,也就是说键范围锁的实际范围为键范围+到下一个NEXT值之间的值(包含NEXT值);

对比上面的例子,网站空间,可以明白因为表中只有三条数据,相当于所有数据,Next的值就是无穷大,所以Key-range的范围变成了无穷大。如果我们现在插入记录4再执行上面的语句可以看到执行成功(此时锁定的记录为1-4,100并不在这个范围区间,所以可以成功插入)。


通过上面的例子可以看到Rang Lock的范围比我们一般认识的要大,使用时要格外注意。


关于Rang Lock参考:(v=sql.105).aspx

本文出自 “关注SQL Server技术” 博客,请务必保留此出处

,香港虚拟主机,美国空间
推荐阅读
  • 作为一名Java Web开发新手,我在尝试将项目部署至Tomcat服务器并连接MySQL数据库时遇到了驱动加载失败的问题。经过一番排查和努力,最终找到了解决方案。 ... [详细]
  • sqlserver动态分区方案例子
    sqlserver动态分区方案例子当我们存储的数据量比较大时,比如超过千万,上亿级别时单纯的使用索引可能效果不明显了,此时我们可以考虑采 ... [详细]
  • 本文总结了WebSphere应用服务器出现宕机问题的解决方法,重点讨论了关键参数的调整,包括数据源连接池、线程池设置以及JVM堆大小等,旨在提升系统的稳定性和性能。 ... [详细]
  • 本文探讨了Java编程中MVC模式的优势与局限,以及如何利用Java开发一款基于鸟瞰视角的赛车游戏。 ... [详细]
  • 尽管PHP是一种强大且灵活的Web开发语言,但开发者在使用过程中常会陷入一些典型的陷阱。本文旨在列出PHP开发中最为常见的10种错误,并提供相应的预防建议。 ... [详细]
  • 基于Java的学生宿舍管理系统设计
    本论文探讨了如何利用Java技术设计和实现一个高效的学生宿舍管理系统。该系统旨在提高宿舍管理的效率,减少人为错误,同时增强用户体验。通过集成用户认证、数据管理和查询功能,系统能够满足学校宿舍管理的多样化需求。 ... [详细]
  • 本文介绍了MySQL数据库的安全权限管理思想及其制度流程,涵盖从项目开发、数据库更新到日常运维等多个方面的详细流程控制,旨在通过严格的流程管理和权限控制,有效预防数据安全隐患。 ... [详细]
  • MyBatis 开发技巧:延迟加载与查询缓存详解
    本文详细探讨了 MyBatis 中的延迟加载和查询缓存机制,旨在帮助开发者更好地理解和利用这些特性来优化数据库访问性能。 ... [详细]
  • 本项目展示了如何利用Java技术构建一个高效的考勤数据管理系统,特别适用于处理大量数据的情况,如企业员工考勤记录等。项目包括完整的源代码和详细的文档说明,适合用于毕业设计或实际工作场景。 ... [详细]
  • 本文详细解析了 SUCTF 2019 中的 EasySQL 题目,重点探讨了堆叠注入与 UNION 注入的区别及其应用条件。 ... [详细]
  • 本文详细探讨了Xshell6评估版到期后无法使用的常见问题,并提供了有效的解决方案,包括如何合法购买授权以继续使用。 ... [详细]
  • 理解 Hibernate 中的 fetch 和 lazy 属性配置
    本文探讨了在 Hibernate 中如何利用 fetch 和 lazy 属性来优化数据查询效率。通过调整这两个参数,可以有效管理数据库查询的性能,减少不必要的资源消耗。 ... [详细]
  • 深入理解聚簇索引与非聚簇索引及其优化策略
    本文探讨了数据库性能优化中的关键因素——索引,特别是聚簇索引与非聚簇索引的区别及应用场景。通过实例分析,提供了如何有效利用这两种索引来提升数据库查询性能的方法。 ... [详细]
  • 日志记录对于软件开发至关重要,特别是在调试和维护阶段。通过日志,开发者能够追踪错误源头并了解系统的运行状态。本文将探讨如何在Django框架中有效配置和使用日志记录功能。 ... [详细]
  • 一、Merge语句根据条件在表中执行修改或插入数据的功能,如果插入的数据行在目的表中存在就执行UPDATE,如果是不存在则执行INSERT:-避免了单独 ... [详细]
author-avatar
林老悲--
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有