2020年中级数据库系统工程师考试笔记12—事务管理

11. 事务管理

在这里插入图片描述

11.1 本章重点

本章特别重要,上午题下午题考官都很爱它,嗯!单单2020年11月08日的下午题就考了两段锁协议、死锁、事务控制以及检查点等知识,吃透本章,于工作于考试均不亏!

在这里插入图片描述

11.2 事务的基本概念

11.2.1 概述

  事务(Transaction)是一系列的数据库操作,是数据库应用程序的基本逻辑单位,即应用程序对数据库的操作都应该以事务的方式进行。

  事务是一个操作序列,这些操作“要么都做,要么都不做”,是数据库环境中不可分割的逻辑工作单位,事务和程序是两个不同的概念,一般一个程序可包含多个事务。

  事务定义的语句如下:

  (1)BEGIN TRANSACTION:事务开始;

  (2)END TRANSACTION:事务结束;

  (3)COMMIT:事务提交,该操作表示事务成功的结束,它将通知事务管理器该事物的所有更新操作现在可以被提交或永久德保留;

  (4)ROLLBACK:事务回滚,该操作表示事务非成功的结束,它将通知事务管理器出故障了,数据库可能处于不一致的状态,该事物的所有更新操作必须回滚或撤销。

  SQL中事务的开始与结束:SQL标准规定当一条sql语句被执行,就隐式的开始了一个事务,SQL中的Commit work和Rollback work语句都是结束一个事务的标志。

  (1)Commit work:提交当前事务,这意味着该事务所做的更新在数据库中永久保存,一旦事务提交,一个新的事务自动开始。

  (2)Rollback work:回滚当前事务,这意味着将撤销该事务对数据库的更新,这样,数据库恢复到该事务执行第一条语句之前的状态。

注意:若事务已执行Commit work就不能用Rollback work撤销。数据库系统能够保证在发生诸如某天SQL语句错误、断电、系统崩溃的情况下,若事务还没有执行Commit work,则造成的影响将被回滚。对断电、系统崩溃的情况,回滚实在系统重新启动时进行。

11.2.2 事物的特性

  典型的事务例子是银行转账业务,对于“从账户A转入账户B金额X元”业务,从数据库系统角度包含2个操作:1)从账户A减去X元;2)给账户B加上X元。

  事务的ACID特性:

  1.原子性(Atomicity):事务的所有操作在数据库要么全做要么全不做。

  2.一致性(Consistency):一个事务独立执行的结果,将保持数据的一致性,即数据不会因为事务的执行而遭受破坏。就银行转账案例来说,假设账户A和账户B两者余额加起来是100000,那么不管A和B之间如何转账,转几次账,事务结束后两个账户余额相加起来还是100000,这就是事务的一致性。一致性可以有DBMS的完整性约束机制来自动完成,而复杂的事物则由应用程序来完成。

  3.隔离性(Isolation):一个事务的执行不能被其他事务干扰。并发事务在执行过程中可能会对同一数据操作,这些事务的操作应该不会相互干扰,是相互隔离的。

  4.持久性(Durability):一旦事务提交,它对数据库的改变是永久的,即便系统出现故障也是如此。

11.2.3 事务的状态

  如果不出现故障,事务默认都能执行完成,一旦执行过程发生故障,不能执行完成的事务称之为中止事务;撤销中止事务对数据库的更新称为事务回滚;成功执行完成的事务称为已提交事务

  中止事务可以通过DBMS回滚恢复数据库,已提交事务不能回滚,但可以由程序员或DBA手动执行“补偿事务”撤销提交事务对数据库的影响。

  事务的5种状态:

  1.活动状态:事务的初始状态,事务执行时的状态。

  2.部分提交状态:事务中最后一条语句(事务全部执行完,但实际输出可能还在内存中)被执行后的状态。

  3.失败状态:事务不能继续正常执行的状态。

  4.中止状态:事务回滚并且数据库已经恢复到事务开始执行前的状态,事务进入中止状态后,系统要么重启事务(软硬件错误引起的中止事务)要么杀死事务(事物内部的逻辑造成的错误或者输入错误等造成的中止事务)。

  5.提交状态:事务在部分提交后,将往硬盘上写入数据,当最后一条信息写入后(事务成功完成)的状态,只有事务处于提交状态后才能说事务已经提交。

  事务状态转换图:
在这里插入图片描述

11.3 数据库的并发控制

  所谓并发操作,是指在多用户共享的系统中,许多用户可能同时对同一数据进行操作,并发操作带来的问题是数据的不一致性主要有3类:丢失更新、不可重复度和读脏数据,其主要的原因是事务的并发操作破坏了事务的隔离性。DBMS的并发控制子系统负责协调并发事务的执行,保证数据库的完整性不受破坏,避免用户得到不正确的数据。

11.3.1 事务调度

  1.串行调度(Serial Schedule)是指多个事务依次串行执行,且只有当一个事务的所有操作都执行完后才执行另一个事务的所有操作,案例参详书本P-509。

  对两个事务T0,T1,不论是先执行T0后执行T1,还是先执行T1后执行T0,只要是串行调度,执行的结果都是稳定和正确的,对于N个事务,最多有N!中正确的串行调度。

  2.并发调度(Concurrent Schedule):利用分时的方法同时处理多个事务。对于N个事务进行并发调度,情况会变得复杂得多,调度方案远大于N!个,并且并发调度的结果有可能是错误的。

  3.可恢复调度(Recoverable Schedule):事务Tj要读事务Ti写的数据时,事务Tj必须要先于事务Ti提交。

在这里插入图片描述

11.3.2 并发操作带来的问题

在这里插入图片描述
  1.丢失修改:当两个或多个事物读入同一数据并修改,会发生丢失丢该的问题,如上图丢失修改案例, T 1 T_1 T1事务的A=A-1修改操作被 T 2 T_2 T2事务的A=A-1所覆盖,也就是丢失了 T 1 T_1 T1事务的修改操作。

  2.不可重复读:是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。如上图不可重复读案例中,事务 T 1 T_1 T1分别在 T 2 T_2 T2 t 9 t_9 t9时刻读取了B的值,但是事务 T 2 T_2 T2 t 5 t_5 t5时刻对B的值进行了修改操作,导致 T 1 T_1 T1事务两次读取B的值不同,从而检验运算C=A+B不对(两次运算结果不一致)。也就是在同一事务内两次读取同一数据输出结果不同,是因为在两次读取的时间间隙里,其他事务对该数据进行了修改操作。

  3.读脏数据: 如上图读脏数据案例, T 1 T_1 T1事务修改C数据后(未提交到数据库), T 2 T_2 T2事务读取C数据为200,但是 t 7 t_7 t7时刻 T 1 T_1 T1事务撤销了对C数据的修改,即C恢复原值,那 T 2 T_2 T2事务读到的数据与数据不一致(无效),称之为读脏数据。

  这3种情况是发生在事务并行处理的过程中,原因是多个事务对相同数据的访问,干扰了其他事务的处理,产生了数据的不一致性,是事务隔离性的破坏导致了数据的不一致性。问题的焦点在于事务在读写数据是不加以控制而相互干扰,解决问题的方法是如何保证事务的隔离性入手。

  数据库事务的隔离级别如下:由低到高依次为Read Uncommitted 、Read Committed 、Repeatable Read 、Serializable ,这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。 (非常重要)
在这里插入图片描述

11.3.3.并发调度的可串行性

  数据库系统必须控制事务的并发执行以保证数据库处于一致性状态。

1.可串行化的调度

  多个事务的并发执行是正确的,当且仅当其结果与某一次序串行的执行它们时的结果相同,称这种调度策略是可串行化的调度(Serializability Schedule)。

  可串行性是并发事务正确性的准则,按这个准则规定,一个给定的并发调度,当且仅当它是可串行化的才认为是正确调度。

2.冲突可串行化

  冲突(Conflict):当 I i I_i Ii I j I_j Ij是不同事务在相同的数据项上操作的命令,且至少有一个是write命令时(不同的事务对同一数据的读写操作和写写操作),则称 I i I_i Ii I j I_j Ij是冲突的。

  等价调度:设 I i I_i Ii I j I_j Ij是调度S的两条连续命令,若 I i I_i Ii I j I_j Ij是不同事务的命令且不冲突,则可由交换 I i I_i Ii I j I_j Ij的顺序得到一个新的调度 S ∗ S^* S,则 S S S S ∗ S^* S是等价的。

  冲突等价:如果调度 S S S经过一系列非冲突命令交换成 S ∗ S^* S,则称 S ∗ S^* S S S S是冲突等价的。

  冲突可串行化:若调度 S S S与一个串行调度 S ∗ S^* S冲突等价,则 S S S是冲突可串行化的。

概念读得晕乎乎,总而言之这些条条框框都是服务于避免并发操作问题的,工作中遇到实操几次就明了了,不要纠结于这些弯弯绕绕的理论。

3.冲突可串行化判定

  在设计并发控制机制时,必须证明该机制产生的调度是否可串行化,一般通过S构造一个有向图—优先图(Precedence Graph)G(V,E)来判定,V由所有事务组成的顶点集,E是一个边集,由满足下述三个条件的边 T i → T j T_i→T_j TiTj组成:

  (1)在 T j T_j Tj执read(A)之前, T i T_i Ti执行write(A);

  (2)在 T j T_j Tj执write(A)之前, T i T_i Ti执行read(A);

  (3)在 T j T_j Tj执write(A)之前, T i T_i Ti执行write(A)。

  如果优先图中存在边 T i → T j T_i→T_j TiTj,则任何等价于 S S S的串行调度 S ′ S' S中, T i T_i Ti必出现在 T j T_j Tj之前。

在这里插入图片描述
在这里插入图片描述
  对应以上2图的优先图:调度S4中,T0执行read(A)优先于T1执行write(A),所有有一条边 T 0 → T 1 T_0→T_1 T0T1,又因为T1执行read(B)优先于T0执行write(B),所有有边 T 1 → T 0 T_1→T_0 T1T0

在这里插入图片描述
  有过调度S的优先图中存在环,则调度S是冲突不可串行化的,如果无环,则调度S是冲突可串行化的。

11.3.4 并发控制技术

  并发事务控制的最常用手段是加锁,该方法只允许事务访问当前持有锁的数据项,常用锁:排它锁和共享锁。

  排他锁(Exclusive Locks,X锁)也称为写锁,用于对数据进行写操作时进行锁定,如果事务T对数据A加上X锁后,就只允许事务T对读取和修改数据A,其他事务对数据A不能再加任何锁,也不能读取和修改数据A,知道事务T释放A上的锁。

  共享锁(Share Locks,S锁)也称为读锁,用于对数据读操作的锁定。如果事务T对数据A加上了S锁后,事务T就只能读数据A但不可以修改,其他事务可以在对数据A加S锁来读取,只要数据A上有S锁,任何事务都只能对其加S锁读取而不能加X锁修改数据。

  简言之,若T事务对A数据加了X锁,其他事务对数据A不能加X锁和S锁;若T事务对A数据加了S锁,其他事务对数据A能加S锁,不能加X锁。

11.3.5 两段锁协议

  通过封锁协议来解决在保证事务的一致性的前提下尽可能提高并发性问题,封锁协议主要是三级封锁协议和两段锁协议。

1.封锁协议

  (1)一级封锁协议:是事务T在修改数据A之前必须先对其加X锁,直到事务结束才释放X锁,用来解决丢失修改问题。

  (2)二级封锁协议:是在一级封锁协议基础上加上事务T在读取数据A之前必须对其加上S锁,读完后即可释放S锁,解决读脏数据的问题。

  (3)三级封锁协议:是在一级封锁协议基础上加上事务T在读取数据A之前必须对其加上S锁,直到事务结束才可释放S锁,解决了不可重复度的问题。

2.两段锁协议

  两段锁协议是指任何数据进行读写之前必须对该数据加锁,在释放一个封锁之后,事务不再申请和获得任何其他封锁。

  所谓“两段”锁含义:事务分为两阶段,第一阶段获得封锁,也称为扩展阶段,第二阶段是释放封锁,也称为收缩阶段。

  如果事务都遵循两段锁协议,那么他们的并发调度是可串行化的。两段锁是可串行化的充分不必要条件。也就是如果事务不遵循两段锁协议,那么它们的调度可能是可串行也可能不可串行。

注意:采用两段锁协议也有可能产生死锁,因为每个事务都不能及时解除被他封锁的数据,可能会导致多个事务互相都要求对方已封锁的数据不能继续运行。

3.活锁和死锁

  所谓活锁:如果事务 T 1 T_1 T1封锁了数据 R R R,事务 T 2 T_2 T2又请求封锁 R R R,于是 T 2 T_2 T2等待。 T 3 T_3 T3也请求封锁 R R R,当 T 1 T_1 T1释放了R上的封锁之后系统首先批准了 T 3 T_3 T3的请求, T 2 T_2 T2仍然等待。然后 T 4 T_4 T4又请求封锁 R R R,当 T 3 T_3 T3释放了 R R R上的封锁之后系统又批准了 T 4 T_4 T4的请求,以此类推, T 2 T_2 T2有可能永远等待,避免活锁的简单方法是采用先来先服务的策略。

  所谓死锁:是指两个以上的事务分别请求封锁对方已经封锁的数据,导致长期等待而无法继续运行下去的现象。

  预防封锁:一次封锁法和顺序封锁法。

  解决死锁:DBMS的并发控制子系统一旦检测到系统中存在死锁,就要设法解除。通常采用的方法是选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有的锁,使其它事务得以继续运行下去。当然,对撤消的事务所执行的数据修改操作必须加以恢复。

11.3.6 多粒度封锁协议(了解一下P517)

11.4 数据库的备份与恢复

11.4.1 数据库系统故障种类

  1.事务故障:由于程序执行错误引起事务非预期的、异常终止的故障,通常来源主要有逻辑错误(非法输入、找不到数据、溢出、超出资源限制等)和系统错误(比如死锁),事务故障由DBMS系统来实现故障恢复,通过撤销事务(UNDO)来强行回滚该事务操作。

  2.系统故障:是指硬件故障、软件(如DBMS、OS或者应用程序)漏洞的影响下,导致丢失了内存中的信息,影响正在执行的事务,单位破坏存储在外存储上的信息。

  3.介质故障:是指数据库的存储介质发生故障,如磁盘损坏、瞬间强磁场干扰等,这种故障破坏了数据库,会影响到所有正在读取这部分数据的事务。

11.4.2 数据库备份

  数据转出是将数据库自制到另一个磁盘或磁带上保存起来,也就是数据备份。

  1.静态转储和动态转储:静态转储是指转出期间不允许对数据库进行任何存取修改操作;动态转储是在转出期间允许对数据库进行存取、修改操作,因此转出和用户事务可以并发执行。

  2.海量转储和增量转储:海量转储就是全量备份,增量转储就是每次只转储自上次转储后更新过的数据。

  3.日志文件:在事务处理的过程中,DBMS把事务开始、事务结束以及对数据库的增删改的每一次操作写入日志文件。DBMS可以利用日志文件进行事务故障和系统故障的恢复,并可与备份文件实现介质故障恢复。

  4.数据库镜像:也就是数据库复制。

11.4.3 数据库恢复

  数据库恢复主要通过**冗余数据**(数据库备份文件和日志文件)来实现。

1.故障恢复操作

  故障恢复的两个操作:UNDO和REDO

  (1)UNDO(撤销事务):将数据库恢复到事务执行前的正确状态(反向扫描日志文件直至对应事务开始的标识)。

  (2)REDO(重做事务):将已提交的事务重新执行(正向扫描日志文件直至对应事务结束的标识)。

2.故障恢复策略(很重要

  (1)事务故障恢复:由系统自动完成,对用户是透明的,通过UNDO操作使数据库恢复到该事务执行前的正确状态。

  (2)系统故障恢复:在系统重启之后自动执行,对未完成的事务执行UNDO操作,对已提交未写入数据库的事务执行REDO操作。

  (3)介质故障恢复:数据库需要重装,通过故障前最后一次的备份和日志文件,按照系统故障的恢复过程执行UNDO和REDO操作来实现恢复。

11.5 数据库的安全性与完整性

1.安全性违例

  恶意访问的形式主要包括:未经授权读取数据(窃取信息);未经授权修改数据;未经授权破坏数据。数据库安全性是指保护数据库不收恶意访问。保护数据库安全,有五个层次上采取安全性措施:数据库系统层次、操作系统层次、网络层次、物理层次、人员层次。(了解一下即可)

2.授权、视图

  通过DBMA提供的授权功能赋予用户在数据库各个部分上的增删改查等权限;或者通过视图隐藏用户不需要看见的数据,限制用户只能访问所需数据。

3.审计追踪

  审计追踪(Audit Trail)是一个对数据库所有更改的日志,还包括哪个用户执行了更改和什么时候执行的更改等信息。

4.数据加密

  数据加密是计算机系统对信息进行保护的一种最可靠的方法,按照作用不同,主要分为数据传输加密技术、数据存储加密技术、数据完整性的鉴别技术和密钥管理技术。

5.数据库的完整性

  数据库的完整性是指数据的正确性和相容性,完整性约束条件作用的对象可以是表、行和列三种。

说明:
1.疏忽、遗漏、错误之处,欢迎留言批评指正。
2.第11章总结完毕,后续会继续完善补充本章的历年真题,转载请注明出处,整理不易,谢谢!

猜你喜欢

转载自blog.csdn.net/u010257584/article/details/110129672