Con*_*lls 47
DB 锁可以存在于行、页或整个表或索引上。当事务在进行中时,事务持有的锁会占用资源。锁升级是系统将多个锁合并为更高级别的锁(例如,将多个行锁合并到一个页面或将多个页面合并到整个表),通常是为了恢复被大量细粒度锁占用的资源。
它会自动执行此操作,尽管您可以在表上设置标志(请参阅联机书籍中的 ALTER TABLE)以控制该特定表上锁升级的策略。特别是,当您有两个进程同时将不同的行写入同一页时,过早或过度急切的锁升级曾经是旧版本的 Sybase 和 SQL Server 上的一个问题。如果回溯足够远(IIRC SQL Server 6.5),SQL Server 实际上没有行锁定,但只能锁定表或页。如果发生这种情况,您可能会在同一页面中插入记录之间发生争用;通常你会在表上放置一个聚集索引,以便新的插入进入不同的页面。
Man*_*dey 13
SQL Server 执行Lock Escalation以减少内存开销,方法是将几个细粒度的低级锁转换为粗粒度的高级锁。
行锁升级为页面锁是一个神话, @ConcernedOfTunbridgeWells 上面提到的同样是错误的。
如果表的行更新很少,SQL 引擎将尝试在这些行上使用 Row-Locks 或在这些 Pages 上使用 Page-Lock。假设它采用了 Row-Lock。但是如果行更新增加了阈值(约 5k 个锁),那么它不需要多个行锁,而是需要一个表锁。因此,这通过释放多个 Row-Locks 和获取单个 Table-Lock 来减少内存开销,但增加了并发性。页面锁定也会发生同样的情况。
该锁升级阈值是-至少5000个锁,并取决于几个因素,锁升级的详细说明已经在MSDN BOL这里提到:https://technet.microsoft.com/en-us/library/ms184286(v =sql.105).aspx
| 归档时间: |
|
| 查看次数: |
49426 次 |
| 最近记录: |