禁用sqlserver的锁升级

锁升级
与锁的数量和内存压力有关,达到阀值之后,直接升级到table lock,而不会小升级到page lock

减少锁升级的方式有以下几种:

  • 禁用sqlserver实例的锁升级
  • 禁用特定表的锁升级
  • 加大阀值,减少锁升级的可能(sp_configure ‘locks‘, 10000; RECONFIGURE;)
  • 启用行版本控制

禁用数据库实例的锁升级

在SQL Server 2005 中,可以使用跟踪标志 1211、1224 来禁用整个实例中的锁升级。

  • 标志1211-完全禁止锁升级,但锁使用的内存会被限制在动态分配内存的60%,当超过这个值时,更多的锁将会伴随着内存溢出错误而失败。
  • 标志1224-禁止锁升级,但内存使用超过40%时,会自动开启锁升级
  • 如果标志1211和1224跟踪标志同时被设置了,只有标志1211会生效。

禁止特定表的锁升级

在SQL Server 2008及更高版本,可以使用新的选择来禁止某个表的锁升级

ALTER TABLE SET (LOCK_ECALATION = AUTO | TABLE | DISABLE)

  • TABLE: 直接从行锁升级到表锁(此为默认值)
  • AUTO:  如果存在表分区,则升级为分区锁,但不会进一步升级。
  • DISABLE:禁用锁升级,这并不意味着禁用表锁(在序列化隔离等级的条件下进行表扫描等操作时还需要表锁)

关于 rowlock

网上很多资料提到,语句中使用rowlock可以强制使用行锁,但实际测试发现没有效果。

查阅资料显示:使用锁定提示如 ROWLOCK 只改变初始锁定计划。锁提示不能防止锁升级。

Using a lock hint such as ROWLOCK only alters the initial lock plan.  Lock hints do not prevent lock escalation.

https://msdn.microsoft.com/zh-cn/library/ms184286.aspx

https://support.microsoft.com/zh-cn/kb/323630

时间: 2024-10-13 01:02:41

禁用sqlserver的锁升级的相关文章

第19/24周 锁升级(Lock Escalations)

大家好,欢迎回到性能调优培训.上2个星期我们已经讨论了SQLServer里的悲观和乐观锁.今天我想谈下SQL Server里对于锁的一个特殊现象:所谓的锁升级(Lock Escalations).在我们进入那个问题的细节前,我想先谈下SQL Server内部使用的锁层级(Lock Hierarchy). 锁层级(Lock Hierarchy) 2个星期前,当我们开始讨论悲观并发模式(pessimistic concurrency)时,我告诉你SQLServer在记录层会获取共享锁(Shared

锁升级

在今天的文章里,我想谈下SQL Server里锁升级(Lock Escalations).锁升级是SQL Server使用的优化技术,用来控制在SQL Server锁管理里把持锁的数量.我们首先用SQL Server里所谓的锁层级(Lock Hierarchy )开始,因为那是在像SQL Server的关系数据库里,为什么有锁升级概念存在的原因. 锁层级(Lock Hierarchy ) 下图展示了SQL Server使用的锁层级: 从图里可以看到,锁层级开始于数据库层级,向下至行层级.在数据库

sqlserver锁机制详解(sqlserver查看锁)

简介 在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但对于 大多数数据库来说是需要同时处理多个查询的.这些查询并不会像绅士那样排队等待执行,而是会找最短的路径执行.因此,就像十字路口需要一个红绿灯那 样,SQL Server也需要一个红绿灯来告诉查询:什么时候走,什么时候不可以走.这个红绿灯就是锁. 图1.查询可不会像绅士们那样按照次序进行排队 为什么需要锁 在开始谈锁之前,首先要简单了解一下事

SQL Server 控制锁升级

背景知识: 锁升级的路线图.行--> 页 --> 区(extent)-->区(表分区)--> 表: alter table 控制锁的升级行为: 1.table SQL Server 2008中的默认行为,设为这个值时,在表级别启用了锁升级,不管表是否分区. 2.auto 如果以分区就在分区级别启用锁升级,如果没有分区就在表级别启用锁升级. 3.disable不可以把锁升级到表级别.可是对于用了tablock提示或使用可序列化隔离级别下堆的查询我们还是可以看到表锁的存在. 设置方法:

查看sqlserver被锁的表以及如何解锁

查看sqlserver被锁的表以及如何解锁 查看被锁表: select   request_session_id   spid,OBJECT_NAME(resource_associated_entity_id) tableName from   sys.dm_tran_locks where resource_type='OBJECT' spid   锁表进程 tableName   被锁表名 解锁: declare @spid  int Set @spid  = 57 --锁表进程 decl

可串行化隔离级别里的锁升级

在今天的文章里我会讨论下可串行化(SERIALIZABLE)隔离级别里会有的锁升级(Lock Escalations),还有你如何避免.在上个月的7月14日,我已经介绍了SQL Server里锁升级(Lock Escalations)的基本概念还有为什么需要它们.因此请你回到这个文章来理解下这个非常重要的概念. 可串行化(SERIALIZABLE)隔离级别 可串行化(SERIALIZABLE)隔离级别用来阻止所谓的幻影记录(Phantom Records).为了阻止它们,SQL Server使用

什么是锁升级

经常听到DBA在谈论各种数据库时.都会提到一个词语:锁升级. 那么.什么是锁升级呢?它的作用又是什么呢?在什么情况下会出现锁升级呢? 锁升级,就是将众多细粒度锁转换为较少的粗粒度的锁以削减系统开销的进程.假如行锁是有开销的,那对1行加锁可能没问题,但对1万行加锁.那对系统开销就非常大了,此时.数据库就会将其升级为表锁,以降低开销. 在网上摘抄的一个样例,当事务从表中请求行时,SQL Server 自己主动获取受影响的行上的锁,并在包括这些行的页和表或者索引上放置更高级别的意向锁. 当事务控制的锁

Java并发之彻底搞懂偏向锁升级为轻量级锁

网上有许多讲偏向锁,轻量级锁的文章,但对偏向锁如何升级讲的不够明白,有些文章还相互矛盾,经过对jvm源码(biasedLocking.cpp)的仔细分析和追踪,基本升级过程有了一个清晰的过程,现将升级流程阐述如下: 因为偏向锁,锁住对象时,会写入对象头相应的标识,我们先把对象头(官方叫法为:Mark Word)的图示如下(借用了网友的图片): 通过上面的图片,我们可以知道,对象处于偏向锁时,mark word中的偏向锁标记为1,锁标志位为01;下面是分析过jvm源码(biasedLocking.

Synchronized锁性能优化偏向锁轻量级锁升级 多线程中篇(五)

不止一次的提到过,synchronized是Java内置的机制,是JVM层面的,而Lock则是接口,是JDK层面的 尽管最初synchronized的性能效率比较差,但是随着版本的升级,synchronized已经变得原来越强大了 这也是为什么官方建议使用synchronized的原因 毕竟,他是一个关键字啊,这才是亲儿子,Lock,终归差了一点 简单看下,synchronized大致都经过了哪些重要的变革 重量级锁 对于最原始的synchronized关键字,锁被称之为重量级锁 因为底层依赖监