欢迎来到天天文库
浏览记录
ID:16146015
大小:501.14 KB
页数:23页
时间:2018-08-08
《深入理解 sql server 2008 的锁机制》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、相比于SQLServer2005(比如快照隔离和改进的锁与死锁监视),SQLServer2008并没有在锁的行为和特性上做出任何重大改变。SQLServer2008引入的一个主要新特性是在表级控制锁升级行为的能力。新的LOCK_ESCALATION表选项允许你启用或禁用表级锁升级。这个新特性能够减少锁竞争并且改善并发性,特别是对于分区表(partitionedtables)。SQLServer2008的另一个改变是不再支持Locksconfiguration设定。同样不再被支持的还有timestamp数据类型,它已被rowversion数据类型取
2、代。为什么需要锁?在任何多用户的数据库中,必须有一套用于数据修改的一致的规则。对于真正的事务处理型数据库,当两个不同的进程试图同时修改同一份数据时,数据库管理系统(DBMS)负责解决它们之间潜在的冲突。任何关系数据库必须支持事务的ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、永久性(Durability)。ACID属性确保数据库中的数据更改被正确地收集到一起,并且数据将保持在与所采取动作相一致的状态。锁的主要作用是提供事务所需的隔离。隔离确保事务之间不会相互干扰,即,一个给定的事务不
3、会读取或修改正在被另一个事务修改的数据。此外,锁提供的隔离性有助于保证事务间的一致性。没有锁,一致的事务处理是不可能的。SQLServer中的事务隔离级别隔离级别决定了一个事务中正被访问或修改的数据受保护并免于被他事务修改的程度。理论上,每个事务都应该完全与其他事务隔离开来。然而,出于可行性和性能方面的原因,实践中这几乎是不可能做到的。在并发环境中如果没有锁和隔离,可能发生以下4种情况:·丢失更新--在这种情况下,事务与事务之间没有隔离。多个事务能够读取同一份数据并且修改它。最后对数据集做出修改的事务将胜出,而其他所有事务所作的修改都丢失了。·脏
4、读--在这种情况下,一个事务能够读取正被其他事务修改的数据。被第一个事务读取的数据是不一致的,因为另一个事务可能会回滚所作的修改。·不可重复读--这种情况有点类似于没有任何隔离,一个事务两次读取数据,但是在第二次读取发生前,另一个事务修改了该数据;因此,两次读取所得到的结果是不同的。因为读操作不能保证每次都是课重复进行的,这种情况被称作“不可重复读”。·幻读--这种情况类似于不可重复读。然而,不是先前被读取的实际行在事务完成前发生了改变,而是额外的行被添加到了表中,导致第二次读取返回了不同的行集合。SQLServer2008支持6种隔离级别,分别
5、是·ReadUncommitted·ReadCommitted·RepeatableRead·Serializable·Snapshot·ReadCommittedSnapshot(详情请参考我的另一篇blog:SQLServer2008R2事务与隔离级别实例讲解)锁管理器解决不同用户进程间锁冲突的职责落到了SQLServerLockManager身上。SQLServer自动地给进程分配锁,以保证资源的当前用户拥有该资源的一致视图,从某个特定操作的开始至结束。LockManager负责决定适当的锁类型(如shared,exclusive,upda
6、te)和锁粒度(如row,page,table),根据正在执行的操作类型和所影响的数据量。LockManager还管理试图访问同一资源的锁类型之间的兼容性,解决死锁,必要时升级锁到一个更高的级别。LockManager为共享数据和内部系统资源管理锁。对于共享数据,LockManager管理表以及数据页、文本页、叶级索引页上的行级锁、页级锁和表级锁。内部地,LockManager使用门闩(latch)来管理索引行和页上的锁控制对内部数据结构的访问,以及在某些情况下,用于取回单个的数据行。门闩提供了更好的系统性能,因为它不像锁那般资源密集。门闩也提供
7、了比锁更好的并发性。门闩典型地用于像页拆分、索引行的删除、索引中行的移动等操作。锁与门闩之间最主要的区别在于,锁在整个事务存续期间都被持有,而门闩仅在需要它的操作存续期间被持有。锁用于保证数据的逻辑一致性,而门闩用于保证数据和数据结构的物理一致性。SQLServer锁类型锁在SQLServer中是自动处理的。LockManager基于事务类型(如SELECT,INSERT,UPDATE,或者DELETE)选择锁的类型.LockManager使用以下的锁类型:·共享锁·更新锁·独占锁·意向锁·架构锁·大容量更新锁除了选择锁类型,LockManage
8、r还基于所执行语句的性质以及所影响的行数自动地调整锁粒度(如row,page,table)。共享锁缺省地,SQLServer为所有读操作
此文档下载收益归作者所有