深入理解 SQL Server 2008 的锁机制_ITPUB博客
深入理解 SQL Server 2008 的锁机制
原创 SQL Server 作者:yuzhangqi 时间:2014-02-26 14:25:37 24700 1
相比于 SQL Server 2005(比如快照隔离和改进的锁与死锁监视),SQL Server 2008 并没有在锁的行为和特
性上做出任何重大改变。SQL Server 2008 引入的一个主要新特性是在表级控制锁升级行为的能力。新的
LOCK_ESCALATION表选项允许你启用或禁用表级锁升级。这个新特性能够减少锁竞争并且改善并发性,特别
是对于分区表(partitioned tables)。
SQL Server 2008 的另一个改变是不再支持Locks configuration设定。同样不再被支持的还有timestamp数据
类型,它已被rowversion数据类型取代。
为什么需要锁?
在任何多用户的数据库中,必须有一套用于数据修改的一致的规则。对于真正的事务处理型数据库,当两个不
同的进程试图同时修改同一份数据时,数据库管理系统(DBMS)负责解决它们之间潜在的冲突。
任何关系数据库必须支持事务的ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性
(Isolation)、永久性(Durability)。ACID属性确保数据库中的数据更改被正确地收集到一起,并且数据将
保持在与所采取动作相一致的状态。
锁的主要作用是提供事务所需的隔离。隔离确保事务之间不会相互干扰,即,一个给定的事务不会读取或修改
正在被另一个事务修改的数据。此外,锁提供的隔离性有助于保证事务间的一致性。没有锁,一致的事务处理
是不可能的。
SQL Server 中的事务隔离级别
隔离级别决定了一个事务中正被访问或修改的数据受保护并免于被他事务修改的程度。理论上,每个事务都应
该完全与其他事务隔离开来。然而,出于可行性和性能方面的原因,实践中这几乎是不可能做到的。在并发环
境中如果没有锁和隔离,可能发生以下4种情况:
丢失更新 -- 在这种情况下,事务与事务之间没有隔离。多个事务能够读取同一份数据并且修改它。最后
对数据集做出修改的事务将胜出,而其他所有事务所作的修改都丢失了。
脏读 -- 在这种情况下,一个事务能够读取正被其他事务修改的数据。被第一个事务读取的数据是不一致
的,因为另一个事务可能会回滚所作的修改。
不可重复读 -- 这种情况有点类似于没有任何隔离,一个事务两次读取数据,但是在第二次读取发生前,
另一个事务修改了该数据;因此,两次读取所得到的结果是不同的。因为读操作不能保证每次都是课重复
进行的,这种情况被称作“不可重复读”。
幻读 -- 这种情况类似于不可重复读。然而,不是先前被读取的实际行在事务完成前发生了改变,而是额
外的行被添加到了表中,导致第二次读取返回了不同的行集合。
SQL Server 2008 支持6种隔离级别,分别是
相关文档
评论