SQL2008中SQL应用之-锁定(locking)应用分析
可以锁定SQLServer中的各种对象,既可以是一个行,也可以是一个表或数据库。可以锁定的资源在粒度(granularity)上差异很大。从细(行)到粗(数据库)。细粒度锁允许更大的数据库并发,因为用户能对某些未锁定的行执行查询。然而,每个由SQLServer产生的锁都需要内存,所以数以千计独立的行级别的锁也会影响SQLServer的性能。粗粒度的锁降低了并发性,但消耗的资源也较少。下表介绍SQLServer可以锁定的资源:
不是所有的锁都能彼此兼容。例如,一个被排他锁锁定的资源不能被再加其他锁。其他事务必须等待或超时,直到排他锁被释放。被更新锁锁定的资源只能接受其他事务的共享锁。被共享锁锁定的资源还能接受其他的共享锁或更新锁。
SQLServer自动分配和升级锁。升级意味着细粒度的锁(行或页锁)被转化为粗粒度的表锁。当单个T-SQL语句在单个表或索引上获取5000多个锁,或者SQLServer实例中的锁数量超过可用内存阈值时,SQLServer会尝试启动锁升级。锁占用系统内存,因此把很多锁转化为一个较大的锁能释放内存资源。然而,在释放内存资源的同时会降低并发性。
下面演示一个实例,它使用sys.dm_tran_locks动态视图监视数据库中锁的活动。
打开一个查询窗口,执行如下语句:
USEAdventureWorks
BEGINTRAN
SELECTProductID,ModifiedDate
FROMProduction.ProductDocument
WITH(TABLOCKX)
打开另一个查询窗口,执行:
SELECTrequest_session_idsessionid,
resource_typetype,
resource_database_iddbid,
OBJECT_NAME(resource_associated_entity_id,resource_database_id)objectname,
request_modermode,
request_statusrstatus
FROMsys.dm_tran_locks
WHEREresource_typeIN("DATABASE","OBJECT")
执行结果:
/*
sessionidtypedbidobjectnamermoderstatus
51DATABASE4NULLSGRANT
52DATABASE4NULLSGRANT
53DATABASE8NULLSGRANT
56DATABASE8NULLSGRANT
53OBJECT8ProductDocumentXGRANT
*/
解析:本示例中,我们首先启动了一个新事务,并使用TABLOCKX锁提示(这个提示对表放置了排他锁),对Production.ProductDocument表执行了一个查询。查询sys.dm_tran_locks动态管理视力可以监视当前SQLServer实例中打开了哪些锁。它返回了
前三列定义了会话锁、资源类型和数据库ID。第四列使用了Object_Name函数,注意它使用了两个参数(对象ID和数据库ID)来指定访问哪个名称(第二个参数是SQLServer2005SP2引入的,它用来指定为了转换对象名称而使用哪个数据库)。同时也查询锁定请求模式和状态,最后,From子句引用DMV,用Where子句指定了两个资源类型。Resource_Type指定了锁定的资源类型,如Database\Object\File\Page\Key\RID\Extent\Metadata\Application\Allocation_Unit或HOBT类型。依赖资源类型的resource_associated_entity_id,确定ID是objectID,allocationunitID,或HobtID。
使用
ALTERTABLEPerson.Address
SET(LOCK_ESCALATION=AUTO)
--注意这句在SQLServer2005下会出错
SELECTlock_escalation,lock_escalation_desc
FROMsys.tables
WHEREname="Address"
/*
lock_escalationlock_escalation_desc
2AUTO
*/
下来,我们禁用锁升级:
ALTERTABLEPerson.Address
SET(LOCK_ESCALATION=DISABLE)
SELECTlock_escalation,lock_escalation_desc
FROMsys.tables
WHEREname="Address"
/*
lock_escalationlock_escalation_desc
1DISABLE
*/
说明:在更改了这个配置后,可以通过查询sys.tables目录视图的lock_escalation_desc列来验证这个选项。
注意:如果表未分区,通常情况为表级别升级。如果你指定了Disable选项,将不会出现表级别的锁升级。这会提高并发性,但如果你请求访问大量的行或页,会增加内存的消耗。
邀月来自http://www.cnblogs.com/downmoon
相关文章
- Shiro框架基本知识及应用「建议收藏」
- docker-应用
- call、apply、bind的应用和区别
- Oracle更新SQL:掌握更高效率(oracle更新sql)
- Linux下C语言应用程序开发实践(linuxc应用开发)
- MySQL中的SQL分析工具:强大而实用(mysql分析sql工具)
- SQL如何转换成MySQL,易学易用(sql转换成mysql)
- :MySQL移除重复记录的SQL语句方法(mysql删除重复sql)
- 语句执行情况分析Oracle中当天SQL语句的执行情况(oracle当天sql)
- SQL Server表行锁技术的优势及应用(sqlserver表行锁)
- SQL Server如何应用范例解决实际问题(sqlserver范例)
- 深入了解Oracle监听SQL技术(oracle监听sql)
- 从SQL Server获取数据进行分析及应用(sqlserver 并且)
- 如何使用MySQL添加SQL文件:一步步指南(mysql添加sql文件)
- SQL Server:高效学习和应用(sqlserver好书)
- 掌握Oracle中的SQL语句奥妙(oracle中sql语句)
- _initsem_init系统调用在Linux中的应用(linux的sem)
- MySQL 中 SQL 比较详解常用语句及其实现方法(mysql中sql比较)
- MySQL SQL优化25字,只是简明扼要地表达了文章的主题(mysql中sql优化)
- MySQL中实现动态SQL的方法与技巧(mysql中动态sql)
- Oracle SQL在数据库中的应用(oracle中sql应用)
- Oracle中SQL的分类与应用(oracle中sql分类)
- 从Oracle中探索SQL函数的应用(oracle中sql函数)
- Oracle SQL环比分析发掘数据背后的规律(oracle_sql环比)
- 化分析利用Oracle SQL进行量化分析(oracle sql?量)
- 优化Oracle SQL调度的绝佳方法(oracle sql调度)
- 用Oracle SQL实现数据库快速生成(oracle sql生成)
- 几个经典的ASP应用