SQL2005中的事务与锁定(七)
作者 佚名技术
来源 数据库编程
浏览
发布时间 2012-03-22
放对象上先前获得的行、键、分页锁定。升级失败发生当另外一个进程对表有行或页有排它锁定时。 锁升级潜在的危险: 1、 锁升级的结果一定是一个完全表级锁定,也就是不可能出现行锁升级为页锁的,最细的行级锁升级的直接结果一定是表锁定。 2、 锁升级可能造成意外的阻塞(这个应该是很好理解的) 3、 锁升级成功后无法降级 禁止升级 我们知道锁升级是有潜在的危险,并且这种升级的结果是不可能现降级除非事务结束。所以升级不是对所有的应用都是一件好事,MS提供了两个开关项:1211和1224,我们可以通过设置跟踪标识来禁止升级。 7、行锁、页锁 7.0之前的版本锁定的最小粒度就是页锁,提醒大家一下那时的页面最小单位是2K,如果细心部署一定程度上是可以满足够大的呑吐量和可以接受的响应时间。然后7.0后把分页从2KB提升为8KB时(为什么要提升呢?嘿嘿,留一个疑问给大家),这种页面锁定对并发能力是一种挑战,也就是锁定的范围是7.0之前的4倍,这时并发及响应时间都成一个问题。SQL2005完全实现行级锁定,显然这对并发响应是可喜的,可是正如我在锁升级里给大家算的一笔帐,在有限可利用的锁定资源前提下,大量行级锁定的代价还是让人无法接受的,特别在极限的状态下。 我们知道锁定操作是一个密集型操作,一个锁定不仅要看到内存的损耗,还要看到SQLSERVER管理这些锁定对其本身来也是一种负荷。虽然SQL内部使用闩或自旋锁来降低这种负荷,但我们很容易可以想像管理一个分页锁定比管理N个行级锁定(假设页面内有N行记录)更轻松、更有效率。 比较行锁和页锁,行锁降低了并发冲突但是资源的损耗也是显然的,页锁减少必须存在锁的数量及管理这些锁定的资源损耗但是以并发能下降为代价的。到底哪个更合适,恐怕不是一句两句能说完的,因为针对不同应用、不同行业、不同并发模型、不同隔离两都各有各的优势。 在SQLSERVER2005可以用sp_indexoption来控制索引的锁定单位。关于这个设置我们可以看看联机帮助,但是一定要注意它只针对索引所以对堆表无法控制分页锁定。 8、动态管理锁定 SQL造择锁定类型、粒度是基于行数、可能扫描的页面数、分页上的行数,隔离级别、进行的何种操作、可使用的系统资源等因素的影响 ,根据这些影响因素SQLSERVER选择一种合适的锁定模式这个过程称动态锁定策略(我发现策略在MS很流行),数据库引擎(还有印象我有引擎结构中介绍的存储引擎吧)动态的管理粒度和锁定模式,控制锁定与系统资源的最佳成本效率。一个范围内的锁定所要使用的系统资源肯定小,但是系统的并发性也就降低,如果选择小范围内的锁定,那管理锁定所使用的系统资源上升,然而并发性能却得到了淋漓发挥。 一般情况我们可使用系统缺省设置(行级锁定是系统缺省的),让系统决定是否要进行锁定的升级。这样一来简化我们对库锁定的管理,系统根据实际情况平衡负载。 9、死锁 首先,我们得清楚死锁与等待是两回事。等待是当前进程所需要的资源让另一个进程排它了,只要另外一个进程释放,当时进程就可以继续执行(当然如果另外这个进程已经死锁那会进入无限期等待,但是这种情况一般不会发生,因为SQLSERVER会干预死锁的。另外我们还有一个锁定超时设置 ,这方面大家可以看联机丛书)。而死锁是发生在两个进程间,在没有人为干预两个锁定的进程是都无法继续工作的一种困境。另外一个显著的地方就是死锁一旦发生,SQLSERVER就会 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于SQL2005中的事务与锁定(七)的所有评论