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

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


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


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


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


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


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


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

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


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


本文转自 lzf328 51CTO博客,原文链接:

http://blog.51cto.com/lzf328/1123874


相关文章
|
SQL 测试技术 C#
SQL Server死锁中的会话隔离级别为序列化(Serializable)实验测试
SQL Server死锁中的会话隔离级别为序列化(Serializable)实验测试最近在分析SQL Server的死锁时,发现一个比较有意思的现象,发现死锁当中一个会话的隔离级别为序列化(Serializable),这个是让人比较奇怪的地方,我们知道SQL Server数据库的默认隔离级别为已提交读(READ COMMITTED),除非人为设置事务隔离级别(TRANSACTION ISOLATION LEVEL),否则事务隔离级别会使用数据库的默认隔离级别。
21976 0
|
SQL 测试技术 索引
浅析SQL Server在可序列化隔离级别下,防止幻读的范围锁的锁定问题
原文:浅析SQL Server在可序列化隔离级别下,防止幻读的范围锁的锁定问题   本文出处:http://www.cnblogs.com/wy123/p/7501261.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他)     数据库在处理并发事物的过程中,在不同的隔离级别下有不同的锁表现,在非可序列化隔离级别下,存在着脏读,不可重复读,丢失更新,幻读等情况。
1342 0
|
7月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
396 1
|
7月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
368 1
|
11月前
|
存储 Java 编译器
说一说关于序列化/反序列化中的细节问题
我是小假 期待与你的下一次相遇 ~
221 1
|
11月前
|
JSON Java 数据库连接
|
12月前
|
存储 安全 IDE
说一说序列化与反序列化中存在的问题
本文详细解析了Java中的序列化机制,包括序列化的概念、实现方式及应用场景。通过Student类的实例演示了对象的序列化与反序列化过程,并分析了`Serializable`接口的作用以及`serialVersionUID`的重要意义。此外,文章还探讨了如何通过自定义`readObject()`方法增强序列化的安全性,以及解决可序列化单例模式中可能产生的多实例问题。最后提供了代码示例和运行结果,帮助读者深入理解序列化的原理与实践技巧。
301 3
|
12月前
|
JSON JavaScript 前端开发
Go语言JSON 序列化与反序列化 -《Go语言实战指南》
本文介绍了 Go 语言中使用 `encoding/json` 包实现 JSON 与数据结构之间的转换。内容涵盖序列化(`Marshal`)和反序列化(`Unmarshal`),包括基本示例、结构体字段标签的使用、控制字段行为的标签(如 `omitempty` 和 `-`)、处理 `map` 和切片、嵌套结构体序列化、反序列化未知结构(使用 `map[string]interface{}`)以及 JSON 数组的解析。最后通过表格总结了序列化与反序列化的方法及类型要求,帮助开发者快速掌握 JSON 数据处理技巧。
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。

热门文章

最新文章