文档详情

第8章游标﹒事务和锁.ppt

发布:2017-05-02约1.21万字共51页下载文档
文本预览下载声明
7.2.2 封锁 表7.1 锁类型及其作用 锁 模 式 描 述 共享 (S) 用于只读操作,如 SELECT 语句 更新 (U) 用于可更新的资源中,防止当多个会话在读取、锁定及随后可能进行的资源更新时发生常见形式的死锁 排他(X) 用于数据修改操作,如 INSERT,UPDATE 或 DELETE,确保不会同时对同一资源进行多重更新 意向 用于建立锁的层次结构,意向锁的类型为意向共享 (IS)、意向排他(IX)及意向排他共享(SIX) 表7.1给出了上述封锁类型的作用。有些锁之间是相容的,如共享锁和更新锁;有些锁之间是不相容的,如共享锁和排他锁。表7.2列出了各种锁之间的相容性。 7.2.2 封锁 表7.2 各种锁之间的相容性 锁 模 式 IS S U IX SIX X IS 相容 相容 相容 相容 相容 不相容 S 相容 兼容 相容 不相容 不相容 不相容 U 相容 相容 不相容 不相容 不相容 不相容 IX 相容 不相容 不相容 相容 不相容 不相容 SIX 相容 不相容 不相容 不相容 不相容 不相容 X 不相容 不相容 不相容 不相容 不相容 不相容 当一个事务T申请对数据对象A加锁时,若该数据对象上已加了锁,新加的锁必须满足表7.2中锁的相容性。 不同的DBMS支持的锁类型可能不同,例如,对于SQL Server共有6种锁类型,分别是:共享、更新、排他、意向、架构和大容量更新,所以针对具体的DBMS,应参考其使用手册。 7.2.2 封锁 2.封锁粒度 被锁定的对象的数据量称为封锁粒度。 封锁对象可以是逻辑单元,也可以是物理单元。 以关系数据库为例,封锁对象可以是行、列、索引项、页、扩展盘区、表和数据库等。 封锁粒度不同,系统的开销将不同,并且锁定粒度与数据库访问并发度是矛盾的,锁定粒度大,系统开销小但并发度会降低,且对DBMS来说内部管理更简单;锁定粒度小,系统开销大,但可提高并发度。 选择封锁粒度时必须同时考虑开销和并发度两个因素,进行权衡,以求得最优的效果。一般原则为: ● 需要处理大量元组的用户事务,以关系为封锁单元。 ● 需要处理多个关系的大量元组的用户事务,以数据库为封锁单元。 ● 只处理少量元组的用户事务,以元组为封锁单元。 * * 8.3.3 查看锁 在SQL Server2005中可以通过查询sys.dm_tran_locks动态管理视图来获得有关数据库引擎实例中当前活动的锁管理器资源信息。同时也可以使用系统存储过程sp_lock查看锁的信息。 使用系统存储过程sp_lock可以查看SQL Server系统或指定进程对资源的锁定情况,语法格式如下: sp_lock [[@spid1 = ] spid1] [,[@spid2 = ] spid2][ ; ] * * 8.3.4 设置事务隔离级别 隔离级是指一个事务和其他事务的隔离程度,即指定数据库如何保护那些当前正在被其他用户或服务器请求使用的数据。对于同时运行的多个事务,可以通过设置隔离级别来平衡并发性和数据完整性。选择正确的隔离级别可以提高SQL Server的性能。 7.2.3 事务的隔离级别 事务的隔离级别定义了事务并发执行时,事务之间的隔离程度。 如前所述,事务并发执行时,有可能出现数据丢失更新、读“脏”数据、不可重复读,为了避免这些数据不一致的情况,在标准SQL规范中,定义了如下4个事务隔离级别,不同的隔离级别对事务的处理不同。 ① 未授权读取(Read Uncommitted):允许读“脏”数据,但不允许更新丢失。如果一个事务已经开始写数据,则允许其他事务读此数据,但不允许同时进行写操作。 ② 授权读取(Read Committed):读取数据的事务允许其他并行事务访问该数据,但是未提交的写事务将禁止其他事务同时访问该数据。这是大多数主流数据库的默认事务隔离等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了读“脏”数据。该级别适用于大多数系统。 7.2.3 事务的隔离级别 ③ 可重复读(Repeatable Read):禁止不可重复读和读“脏”数据,但有时可能出现“幻像”数据,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务,这保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了读“脏”数据和“不可重复读”的情况。 ④ 序列化(Serializable):提供严格的事务隔离,它要求事务序列化执行,即事务只能一个接着一个地执行。 事务的隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于大多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免读“脏”数据,而且
显示全部
相似文档