sql-server – SQL Server锁升级问题

前端之家收集整理的这篇文章主要介绍了sql-server – SQL Server锁升级问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在阅读 MSDN Page about SQL Server lock escalationsql Server锁升级

我的问题是,似乎存在锁升级的主要原因是为了减少维护更多锁的开销(例如,当为表获取更多行锁时,行级锁被升级到表级).我的问题是,维护更多的锁会提高并发性,这是一个好处,为什么它是一个开销?根据我的拙见,锁定应该尽可能小,以通过提高并发性来提高数据库性能.任何人都可以用简单的方式解释为什么需要锁定升级以及所谓的锁定开销是什么?

提前致谢,
乔治

解决方法

Could anyone explain in simple way why lock escalation is needed and what is the so-called lock overhead please?

当您更新表并锁定行时,您需要以某种方式记录此事实:这是一行,它已被更新并锁定.

当你更新百万行时,你需要做这么多次,因此有一些空间来保持百万次锁.

sql Server在内存中保留一个锁列表,而Oracle则在表空间中执行.

这可能是因为Oracle已经老了(比我大),而且与Oracle相比,sql Server很年轻.

从设计者的角度来看,将临时资源(如锁)保存在永久存储中并不是那么明显的解决方案.只需提一点:您可能需要磁盘写入来执行SELECT FOR UPDATE.

Oracle的核心功能是在80年代早期开发的,当时将内存保留在内存中根本不是一种选择.他们不得不以某种方式使用磁盘空间.

如果要使用磁盘空间,则必须在磁盘上的某处放置一个锁.

如果不在行本身内,哪里可以锁定行?

sql Server的锁系统开发人员在发明名为Sybase的RDBMS设计时,决定在临时存储(即RAM)中存储临时内容(即锁).

但Oracle的设计始终是平衡的:如果数据库中有1,000,000行,那么你有1,000个锁的存储空间,如果你有10亿行,你可能会存储数十亿个锁,等等.

从这个意义上说,sql Server的设计很脆弱,因为你的RAM和硬盘空间可能不平衡.您可以轻松拥有16M的RAM和几TB的磁盘空间.而你的记忆就是无法容纳所有的锁.

这就是为什么当锁定计数达到一定限度时,sql Server决定升级锁定:而不是为数据页面中的10个单独行(需要10条记录)保留锁定,它会锁定整个数据页面(这需要1记录).

另一方面,Oracle在更新行时,只需将锁​​写入数据页.

这就是为什么Oracle的锁是行级的.

Oracle不会以常识的方式“管理”锁定:例如,您无法获取Oracle中锁定页面的列表.

当事务需要更新一行时,它只会进入该行并查看它是否被锁定.

如果是,则查看哪个事务持有锁(此信息包含在数据页中的锁描述符中)并将其自身添加到该事务的通知队列中:当锁定事务死亡时,原始事务会得到通知并锁定数据.

从并发性的角度来看,锁升级完全是一个穷人的解决方案:它不会增加并发性.比方说,你可以锁定你甚至没有碰过的那一行.

性能的角度来看,在内存中执行操作当然比在磁盘上执行操作更快.

但是由于Oracle缓存数据块并且无论如何都在内存中执行上述实际操作,因此性能与它相同或接近.

猜你在找的MsSQL相关文章