数据库事务和锁(四)

数据|数据库

空间管理

    锁是防止其他事务访问指定的资源控制、实现并发控制的一种主要手段。为了提高系统的性能,加快事务的处理速度,缩短事务的等待时间,应该使锁定的资源最小化。为了控制锁定的资源,应该首先了解系统的空间管理。在SQL Server系统中,最小的空间管理单位是页,一个页有8K。所有的数据、日志、索引都存放在页上。另外,使用页有一个限制,这就是表中的一行数据必须在同一个页上,不能跨页。页上面的空间管理单位是簇,一个簇是8个连续的页。表和索引的最小占用单位是簇。数据库是由一个或者多个表或者索引组成,即是由多个簇组成。SQL Server系统的空间管理结构示意图如图3所示。

图3  SQL Server空间管理

可以锁定的资源

为了优化系统的并发性,应该根据事务的大小和系统活动的程度,锁定不同的资源。也就是说,既可以锁定比较大的资源,也可以锁定比较小的资源。在SQL Server系统中,已经比较完善地实现了这些要求。在SQL Server 7.0中,可以锁定的资源有多种,这些可以锁定的资源分别是行、页、簇、表和数据库,他们对应的锁分别是行级锁、页级锁、簇级锁、表级锁和数据库级锁。在如图4所示的结构中,数据行存放在页上,页存放在簇上,一个表有若干个簇组成,而若干个表组成了数据库。在这些可以锁定的资源中,最基本的资源是行、页和表,而簇和数据库是特殊的可以锁定的资源。

图4  表、页、行的结构图

    行是可以锁定的最小空间。在SQL Server 7.0中,实现了行级锁。行级锁就是指事务在操纵数据的过程中,锁定一行或者若干行数据,其他事务不能同时处理这些行的数据。行级锁占用的数据资源最少,所以在事务的处理过程中,允许其他事务继续操纵同一个表或者同一个页的其他数据,大大降低了其他事务等待处理的时间,提高了系统的并发性。页级锁是一种最优锁,因为行级锁不可能出现数据既被占用又没有使用的浪费现象。在图5中,椭圆形表示行级锁占用的数据,而椭圆形之外的其他数据仍然可以由其他事务使用。行级锁是SQL Server 7.0的重要特征,它的引入引起了数据存储引擎的改变。

图5  行级锁

    页级锁是指在事务的操纵过程中,无论事务处理数据的多少,每一次都锁定一页,在这个页上的数据不能被其他事务操纵。在SQL Server 7.0以前,使用的是页级锁。页级锁锁定的资源比行级锁锁定的数据资源多。在页级锁中,即使是一个事务只操纵页上的一行数据,那么该页上的其他数据行也不能被其他事务使用。因此,当使用页级锁时,会出现数据的浪费现象,也就是说,在同一个页上会出现数据被占用却没有使用的现象。在这种现象中,数据的浪费最多不超过一个页上的数据行。在图6中,圆形区表示一个页级锁,在这个圆形区内,只有一个事务可以可以使用圆形区中的数据,其他事务只能使用圆形区以外的数据。

图6  页级锁

    簇级锁是一种特殊类型的锁,只能用在一些特殊的情况下。簇级锁就是指事务占用一个簇,这个簇不能同时被其他事务占用。例如在创建数据库和创建表时,系统分配物理空间时使用这种类型的锁。系统是按照簇分配空间的。当系统分配空间时,使用簇级锁,防止其他事务同时使用同一个簇。当系统完成分配空间之后,就不再使用这种类型的簇级锁。特别是,当涉及到对数据操作的事务时,不使用簇级锁。簇级锁的结构如图7所示。椭圆形区域表示簇级锁占用的数据,其他事务只能使用该簇以外的其他簇。

图7  簇级锁

    表级锁也是一个非常重要的锁。表级锁是指事务在操纵某一个表的数据时,锁定了这个数据所在的整个表,其他事务不能访问该表中的其他数据。当事务处理的数据量比较大时,一般使用表级锁。表级锁的特点是使用比较少的系统资源,但是却占用比较多的数据资源。与行级锁和页级锁相比,表级锁占用的系统资源例如内存比较少,但是占用的数据资源却是最大。在表级锁时,有可能出现数据的大量浪费现象,因为表级锁锁定整个表,那么其他的事务都不能操纵表中的其他数据。这样,会延长其他事务等待处理的时间,降低系统的并发性能。表级锁的结构示意图如图8所示,椭圆形表示表级锁。

图8  表级锁

    数据库级锁是指锁定整个数据库,防止任何用户或者事务对锁定的数据库进行访问。数据库级锁是一种非常特殊的锁,它只是用于数据库的恢复操作过程中。这种等级的锁是一种最高等级的锁,因为它控制整个数据库的操作。只要对数据库进行恢复操作,那么就需要设置数据库为单用户模式,这样系统就能防止其他用户对该数据库进行各种操作。数据库级锁的结构示意图如图9所示。严格地说,数据库级锁不是一种锁,而是一种类似锁的一种单用户模式机制。但是,这种单用户模式机制非常类似锁机制,因此也可以把这种单用户模式称为数据库级锁。

图9  数据库级锁

锁的类型和其兼容性

锁定资源的方式有两种基本形式,一种形式是读操作要求的共享锁,另一种形式是写操作要求的排它锁。除了这两种基本类型的所,还有一些特殊情况的锁,例如意图锁、修改锁和模式锁。在这些各种类型的锁中,有些类型的锁之间是可以兼容的,有些类型的锁之间是不兼容的。

共享锁允许并行事务读取同一种资源,这时的事务不能修改访问的数据。当使用共享锁锁定资源时,不允许修改数据的事务访问数据。当读取数据的事务读完数据之后,立即释放所占用的资源。一般地,当使用SELECT语句访问数据时,系统自动对所访问的数据使用共享锁锁定。对于那些修改数据的事务,例如使用INSERT、UPDATE和DELETE语句,系统自动在所修改的事务上放置排它锁。排它锁就是在同一时间内只允许一个事务访问一种资源,其他事务都不能在有排它锁的资源上访问。在有排它锁的资源上,不能放置共享锁,也就是说不允许可以产生共享锁的事务访问这些资源。只有当产生排它锁的事务结束之后,排它锁锁定的资源才能被其他事务使用。

除了上面的基本锁以外,根据不同的情况,SQL Server还可以使用一些其他类型的锁。这些特殊类型的锁包括意图锁、修改锁和模式锁。

系统使用意图锁来最小化锁之间的冲突。意图锁建立一个锁机制的分层结构,这种结构依据锁定的资源范围从低到高依次是行级锁层、页级锁层和表级锁层。意图锁表示系统希望在层次低的资源上获得共享锁或者排它锁。例如,放置在表级上的意图锁表示一个事务可以在表中的页或者行上放置共享锁。在表级上设置共享锁防止以后另外一个修改该表中页的事务在包含了该页的表上放置排它锁。意图锁可以提高性能,这是因为系统只需要在表级上检查意图锁,确定一个事务能否在哪个表上安全地获取一个锁,而不需要检查表上的每一个行锁或者页锁,确定一个事务是否可以锁定整个表。意图锁有三种类型,即意图共享锁、意图排它锁和使用意图排它的共享锁。意图共享锁表示读低层次资源的事务的意图,把共享锁放在这些单个的资源上。意图排它锁表示修改低层次的事务的意图,把排它锁放在这些单个资源上。意图排它锁包括意图共享锁,它是意图共享锁的超集。使用意图排它的共享锁表示允许并行读取顶层资源的事务的意图,并且修改一些低层次的资源,把意图排它锁放在这些单个资源上。例如,表上的一个使用意图排它的共享锁把共享锁放在表上,允许并行读取,并且把意图排它锁放在将要修改的页上,把排它锁放在修改的行上。每一个表一次只能有一个使用意图排它的共享锁因为表级共享锁阻止对表的任何修改。使用意图排它的共享锁是共享锁和意图排它锁的组合。

当系统将要修改一个页时,使用修改锁。在系统修改该页之前,系统自动地把这个修改页锁上升到排它页锁,防止锁之间发生冲突。当第一次读取页时,在修改操作的开始阶段,获得修改锁。修改锁与共享锁是兼容的。如果该页被修改了,那么修改锁上升到排它锁。

模式锁保证当表或者索引被另外一个会话参考时,不能被删除或者修改其结构模式。SQL Server系统提供了两种类型的模式锁:模式稳定锁和模式修改锁。模式稳定锁确保锁定的资源不能被删除,模式修改锁确保其他会话不能参考正在修改的资源。

有些锁之间是兼容的,例如共享锁和修改锁之间。有些锁之间是不兼容的,例如排它锁和共享锁之间。下面的表1列出了SQL Server系统提供的各种锁之间的兼容性。

表1  SQL Server系统提供的各种锁之间的兼容性

        锁名称

IS

S

U

IX

SIX

X

意图共享锁(IS)

兼容

兼容

兼容

兼容

兼容

不兼容

共享锁(S)

兼容

兼容

兼容

不兼容

不兼容

不兼容

修改锁(U)

兼容

兼容

不兼容

不兼容

不兼容

不兼容

意图排它锁(IX)

兼容

不兼容

不兼容

兼容

不兼容

不兼容

意图排它的共享锁(SIX)

兼容

不兼容

不兼容

不兼容

不兼容

不兼容

排它锁(X)

不兼容

不兼容

不兼容

不兼容

不兼容

不兼容

另外,除了表1中列出的锁之间的兼容性之外,对于模式锁来说,模式修改锁对于全部锁都是不兼容的,而模式稳定锁对于除了模式修改锁之外的全部锁都是兼容的。

时间: 2024-10-02 11:18:32

数据库事务和锁(四)的相关文章

数据库事务和锁(一)

数据|数据库 简述     关系型数据库有四个显著的特征,即安全性.完整性.并发性和监测性.数据库的安全性就是要保证数据库中数据的安全,防止未授权用户随意修改数据库中的数据,确保数据的安全.在大多数数据库管理系统中,主要是通过许可来保证数据库的安全性.完整性是数据库的一个重要特征,也是保证数据库中的数据切实有效.防止错误.实现商业规则的一种重要机制.在数据库中,区别所保存的数据是无用的垃圾还是有价值的信息,主要是依据数据库的完整性是否健全.在SQL Server 7.0中,数据的完整性是通过一系

数据库事务和锁(五)

数据|数据库 死锁问题 死锁是一个很重要的话题.在事务和锁的使用过程中,死锁是一个不可避免的现象.在两种情况下,可以发生死锁.第一种情况是,当两个事务分别锁定了两个单独的对象,这时每一个事务都要求在另外一个事务锁定的对象上获得一个锁,因此每一个事务都必须等待另外一个事务释放占有的锁,这时,就发生了死锁.这种死锁是最典型的死锁形式.在同一时间内有两个事务A和B,事务A有两个操作:锁定表part和请求访问表supplier:事务B也有两个操作:锁定表supplier和请求访问表part.结果,事务A

数据库事务和锁(二)

数据|数据库 事务的工作原理图 事务确保数据的一致性和可恢复性.事务的工作原理如图1所示. 图1   事务的工作原理图     事务开始之后,事务所有的操作都陆续写到事务日志中.写到日志中的操作,一般有两种:一种是针对数据的操作,一种是针对任务的操作.针对数据的操作,例如插入.删除和修改,这是典型的事务操作,这些操作的对象是大量的数据.有些操作是针对任务的,例如创建索引,这些任务操作在事务日志中记录一个标志,用于表示执行了这种操作.当取消这种事务时,系统自动执行这种操作的反操作,保证系统的一致性

数据库事务和锁(三)

数据|数据库 使用事务的考虑 在使用事务时,原则上应该使事务尽可能得短并且要避免事务嵌套.事务应该尽可能得短,这是因为比较长的事务增加了事务占用数据的时间,使其它必须等待访问该事务锁定数据的事务,延长了等待访问数据的时间.在使用事务时,为了使事务尽可能得短,应该采取一些相应的方法.为了最小化时间,在使用一些Transact-SQL语句时,一定要非常小心.例如,当使用循环语句WHILE时,一定要事先确认循环的长度和占用的时间,使这种循环在完成相应的功能之前,一定要确保循环尽可能得短.在开始事务之前

用Microsoft.net实现数据库事务(四)

数据|数据库 附A:事务简介一个事务是一系列动作作为单个逻辑单位来执行,这意味着这些动作要么全部成功,要么全部失败.如果最后一个动作失败了,那么以前的动作应该依次回滚,整个状态回到原先事务开始的状态.例如,有1000美圆从一个银行帐户扣除,转入另外一个帐户,那么事务保证两个事件只能一起成功,只要有一个失败,那么实际就不会发生任何动作,两个帐户没有发生任何改变,钱没有被存入和扣除. ACID属性 有四个属性经常被用来描述事务:原子性(atomicity), 一致性(consistency), 隔离

MSSQL与Oracle数据库事务隔离级别与锁机制对比_oracle

一,事务的4个基本特征 Atomic(原子性): 事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要 么全部成功,要么全部失败. Consistency(一致性): 只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初 状态. Isolation(隔离性): 事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正 确性和完整性.同时,并行事务的修改必须与其他并行事务的修改 相互独立. Durability(持久性): 事务结束后,事务处理的结果必须能够得到固化. 以上属于废话

MS SQL Server数据库事务锁机制分析

server|数据|数据库 锁是网络数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性.各种大型数据库所采用的锁的基本理论是一致的,但在具体实现上各有差别.目前,大多数数据库管理系统都或多或少具有自我调节.自我管理的功能,因此很多用户实际上不清楚锁的理论和所用数据库中锁的具体实现. Microsoft SQL Server(以下简称SQL Server)作为一种中小型数据库管理系统,已经得到了广泛的应用,该系统更强调由系统来管理锁.在用户有SQL请求时,系统分析请求,自

spring学习笔记(20)数据库事务并发与锁详解

多事务运行并发问题 在实际应用中,往往是一台(或多台)服务器向无数客户程序提供服务,当服务器查询数据库获取数据时,如果没有采用必要的隔离机制,可能会存在数据库事务的并发问题,下面是一些常见的并发问题分类: 1. 第一类丢失更新:撤销一个事务,其他事务已提交的更新数据覆盖 2. 第二类丢失更新:一个事务覆盖另一个事务已提交的更新数据 3. 脏读:一个事务读到另一个事务未提交的数据 4. 虚读:一个事物读到另一个已提交的新插入数据 5. 不可重复读:事务读到另一个事务已提交的更新数据 下面对这几类并

数据库事务以及事务的隔离级别

事务:一个逻辑工作单元要成为事务 事务的四个属性:原子性(atomicity).一致性(consistency).隔离性(isolation)和持久性(durability). 1.原子性(Atomic)     最重要的原则,也是最容易理解的原则.被事务管理的所有方法,要么一起被提交,要么一起回滚. 2.一致性(Consistency)     事务在系统完整性中实施一致性,如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于新有效状态.如果在事务中出现错误,那么系统中的所有变化将自动