数据库事务和锁

  简述

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

  在SQL Server 7.0中,数据的完整性是经过一系列逻辑来保障的,这些逻辑分为三个方面,即实体完整性、域完整性和参考完整性。对任何系统均可以这样说,没有监测,就没有优化。这句话用在数据库管理系统方面,也是切合实际的。只有经过对数据库进行全面的性能监测,也才能发现影响系统性能的因素和瓶颈,才能针对瓶颈因素,采起切合实际策略,解决问题,提升系统的性能。并发性也是一个很是重要的概念,它是用来解决多个用户对同一数据进行操做时的问题。数据库

  特别是对于网络数据库来讲,这个特色更加突出。提升数据库的处理速度,单单依靠提升计算机的物理速度是不够的,还必须充分考虑数据库的并发性问题,提升数据库并发性的效率。那么如何保证并发性呢?在这个面向下一世纪的数据库产品SQL Server 7.0中,经过使用事务和锁机制,解决了数据库的并发性问题。

  概念和特色

  事务和锁是两个紧密联系的概念。事务就是一个单元的工做,包括一系列的操做这些操做要么所有成功,要么所有失败。事务确保多个数据的修改做为一个单元来处理。例如,在银行业务中,有一条记账原则,即有借有贷,借贷相等。那么为了保证这种原则,就得有确保借和贷的登记要么同时成功,要么同时失败。安全

  若是出现只记录了借,或者只记录了贷,那么就违反了记账原则,就会出现记错账的状况。SQL Server经过支持事务机制管理多个事务,保证事务的一致性。事务使用锁,防止其余用户修改另一个尚未完成的事务中的数据。对于多用户系统来讲,锁机制是必须的。在SQL Server 7.0中,使用事务日志来保证修改的完整性和可恢复性。

  SQL Server有多种锁,容许事务锁定不一样的资源。锁就是保护指定的资源,不被其余事务操做。为了最小化锁的成本,SQL Server自动地以与任务相应等级的锁来锁定资源对象。锁定比较小的对象,例如锁定行,虽然能够提升并发性,可是却有较高的开支,由于若是锁定许多行,那么须要占有更多的锁。锁定比较大的对象,例如锁定表,会大大下降并发性,由于锁定整个表就限制了其余事务访问该表的其余部分,可是成本开支比较低,由于只需维护比较少的锁。

  事务和锁具备如下特色:

  事务是一个单元的工做,要么全作,要么全不作
  事务保证操做的一致性和可恢复性
  每一条Transact-SQL语句均可以是一个事务
  实际使用的事务是用户定义的事务,它包括一系列操做或者语句
  在多服务器环境中,使用用户定义的分布式事务,保证操做的一致性
  锁是保证并发控制的手段
  能够锁定的资源包括行、页、簇、表和数据库
  锁的类型主要包括共享锁和排它锁
  特殊类型的锁包括意图锁、修改锁和模式锁 
  共享锁容许其余事务继续使用锁定的资源
  排它锁只容许一个事务访问数据
  系统自己能够处理死锁
  用户能够根据实际状况定制锁的一些特征 

  事务的定义

  事务是指一个单元的工做,这些工做要么全作,要么所有不作。做为一个逻辑单元,必须具有四个属性:自动性、一致性、独立性和持久性。自动性是指事务必须是一个自动的单元工做,要么执行所有数据的修改,要么所有数据的修改都不执行。服务器

  一致性是指当事务完成时,必须使全部数据都具备一致的状态。在关系型数据库中,全部的规则必须应用到事务的修改上,以便维护全部数据的完整性。全部的内部数据结构,例如树状的索引与数据之间的连接,在事务结束以后,必须保证正确。网络

  独立性是指并行事务的修改必须与其余并行事务的修改相互独立。一个事务看到的数据要么是另一个事务修改这些事务以前的状态,要么是第二个事务已经修改完成的数据,可是这个事务不能看到正在修改的数据。这种特征也称为串行性。持久性是指当一个事务完成以后,它的影响永久性的产生在系统中,也就是这种修改写到了数据库中。

事务机制保证一组数据的修改要么所有执行,要么所有不执行。SQL Server使用事务保证数据的一致性和确保在系统失败时的可恢复性。事务是一个能够恢复的单元的工做,由一条或者多条Transact-SQL语句组成,能够影响到表中的一行或者多行数据。事务打开之后,直到事务成功完成以后提交为止,或者到事务执行失败所有取消或者滚回去为止。数据结构

 

  ****事务的工做原理图

  事务确保数据的一致性和可恢复性。事务的工做原理如图1所示。并发

                       

1.bmp

                                                                                        图1 事务的工做原理图分布式

 

  事务开始以后,事务全部的操做都陆续写到事务日志中。写到日志中的操做,通常有两种:一种是针对数据的操做,一种是针对任务的操做。针对数据的操做,例如插入、删除和修改,这是典型的事务操做,这些操做的对象是大量的数据。有些操做是针对任务的,例如建立索引,这些任务操做在事务日志中记录一个标志,用于表示执行了这种操做。高并发

  当取消这种事务时,系统自动执行这种操做的反操做,保证系统的一致性。系统自动生成一个检查点机制,这个检查点周期地发生。检查点的周期是系统根据用户定义的时间间隔和系统活动的频度由系统自动计算出来的时间间隔。检查点周期地检查事务日志,若是在事务日志中,事务所有完成,那么检查点将事务日志中的事务提交到数据库中,而且在事务日志中作一个检查点提交标记。 性能

  若是在事务日志中,事务没有完成,那么检查点将事务日志中的事务不提交到数据库中,而且在事务日志中作一个检查点未提交标记。事务的恢复以及检查点保护系统的完整和可恢复,可使用如图2所示的示例说明。优化

                                 2.bmp

图2 事务恢复和检查点示例

        在这个示例图中,有五个事务:事务一、事务二、事务三、事务4和事务5。方框表示事务的开始和完成提交。水平方向表示时间。检查点表示在某一时间点发生检查点机制,系统失败表示在某一时间点因为断电、系统软件失败等缘由而发生的系统失败。

  事务1的完成发生在检查点发生之间,因此事务1被提交到数据库中。事务2和事务4的完成发生在系统失败以前,因此这两个事务能够被系统向前滚动提交到数据库中。事务3和事务5因为系统失败而没有完成,因此这两个事务被取消。