聊聊----sqlserver 事物隔离级别实现原理

2023-02-23 00:00:00 数据 隔离 级别 阻塞 复读

文章前传:
近看了尼采的《查拉图斯科拉如是说》,里面有句名言很打动我,这里引荐:
每个不曾起舞的日子,都是对生命的辜负—尼采

Sql server 事物隔离级别实现

1、sqlserver数据库除了面临ANSI规定4种场景问题(更新丢失读、脏读、非重复读、幻读)之外,还面临以下两种场景问题:

重复读效应:若sqlserver使用默认的read commited隔离级别,那么此现象可能发生。----重复读场景描述:在并发活动中有可能一个查询在表上的一个范围扫描的时候,同时另一个事物加入并行并进行了移动数据的操作。

Halloween效应:由于并发事物中数据在结果集中的位置移动,导致这个数据被多次更新,这个效应和重复读效应不同的是,本halloween是由于update引起,而重复读效应是由于select 引起。

==>以上可得出一个结论sqlserver实现标准隔离级别需要面临更复杂的情况,也侧面证明sqlserver的锁机制更为复杂。

2、sqlserver锁的实现是非常复杂的下面分几个方面介绍




==>以上,图表表示的锁资源的种类。可见sqlserver在锁资上是分出很多层次的,从底层的行,到高的database,可见其复杂度之高。


==以上,sqlserver的lock都是基于内存结构实现,并且在层次低的锁过多的时候会升级成层次更高的锁,存在锁升级的情况,这也是和ORACLE本次的区别,锁的实现一个基于内存,一个基于block的header,在ORACLE不会有锁升级的现象哦。


==>以上,锁模式类别种类繁多,基本上无法用语言直接描述,如此复杂的锁兼容矩阵,读者朋友们其实无需逐行列去理解,每个数据库产品都是在系统中定义了大量的锁模式和锁兼容关系,本质上就是一些程序定义的结构。如果不是做产品的事物模块开发,无必要精通。您若执意去记忆和理解,作者只能佩服您的大脑的并行计算能力,已经初步具备人肉量子的意识。

3、sqlserver的隔离界别实现分为标准实现和基于版本的实现


==>以上,sqlserver按照iso标准实现了数据的4种隔离级别,需要特别说明默认的隔离级别是Read committed,此默认隔离级别若对同一范围的数据进行操作,会出现写入数据阻塞读的情况,这是ISO实现的弊端,更别的Repeatable read 和 serializable 都实现了相对级别要求,即分别避免非重复-读和幻象读现象。


==>以上,sqlserver为了解决ISO隔离级别写入阻塞读的问题,对数据库的实现进行了扩展,引入了两参数个参数READ_COMMITTED_SNAPSHOT、READ_COMMITTED_SNAPSHOT,此两参数可以实现基于版本的读mvcc,这样就实现了无阻塞读,系统级别的TEMPDB,用于存放旧版本数据,类似oracle undo功能。


==>以上,是经过sqlserver 产品改造之后的事物隔离级别支持。读者注意到snapshot和serializable功能是一样的,但是snapshot实现了无阻塞读。

总结:sqlserver的隔离级别实现的ISO标准的要求,在此基础上sqlserver进行了扩展改造,与mysql和oracle自定义实现思路完全不同。



本文来源https://www.modb.pro/db/121688

相关文章