数据库事务的基本概念🌵

事务

定义:是一系列的数据库操作,是数据库应用程序的逻辑单位,即应用程序对数据库的操作都应 该以事务的方式进行。

🎈 事务是一个操作序列,这些操作“要么都做,要么都不做” 。

事务定义的语句如下:

  • BEGIN TRANSACTION:事务开始。

  • END TRANSACTION:事务结束。

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

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

事务的特性

  • 🅰️原子性:事务的所有操作在数据库中要么都做要么都不做。

  • 🍰一致性:一个事务独立执行的结果,将保持数据的一致性,即数据不会因为事务的执行而遭受破 坏。

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

  • 🗡持久性:一个事务一旦提交,它对数据库的改变必须是永久的,即使系统出现故障也是如此。

事务的状态

事务是数据库的基本执行单元,如果事务成功执行,则数据库从一个一致状态进 入另一个一致状态。如果因为某种原因事务没能成功执行,但其已经对数据库进 行了修改,这时候可能会导致数据库处于不一致的状态,需要对事务已经造成的 变更进行撤销(回滚)

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

  2. 部分提交状态:当操作序列的最后一条语句执行后,事务就处于部分提交状态。 这时,事务虽然已经完全执行,但由于实际输出可能还临时驻留在内存中,在事务 成功完成前还有可能出现硬件故障,因此,部分提交状态并不等于事务成功执行。

  3. 失败状态:由于硬件或逻辑错误,使得事务不能继续正常执行,事务就进入了 失败状态,处于失败状态的事务必须回滚。这样,事务就进入了中止状态。

  4. 中止状态:事务回滚并且数据库恢复到事务开始执行前的状态。

  5. 提交状态:当事务成功完成后,称事务处于提交状态。只有事务处于提交状态 后,才能说事务已经提交。

事务调度

  • 串行调度:是指多个事务依次串行执行,且只有当一个事务的所有操作都执行完成才执行另一个 事务的所有操作。

  • 并发调度:利用分时的方法同时处理多个事务。

  • 可恢复调度: 指满足这样的条件的调度:当事务Tj要读事务Ti写的数据时,Ti事务必须要先于事务Tj提交。

🎈并发调度的可串行性

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

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

并发控制技术

并发事务如果对数据读写时不加以控制,会破坏事务的隔离性和一致性。为了保持事务的隔离性, 系统必须对事务之间的相互作用加以控制,最典型的方式就是加锁。

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

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

封锁协议

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

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

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

两段锁协议

定义:是指同一事务对任何数据进行读写之前必须对该数据加锁; 在释放一个封锁之后,该事务不再申请和获得任何其他封锁。所谓“两段”的含义是:事务分为两个阶段。第一阶段是获得封锁,也称为扩展 阶段。第二阶段是释放封锁,也称为收缩阶段。

  • 遵循两段锁协议,一定是可串行化的;不遵循两段锁协议,可能是可串行化的,也可能不是。

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

事务的隔离级别

  1. READ UNCOMMITTED(读未提交):最低级别,任何情况都无法保证。

  2. READ COMMITTED(读已提交):可避免读脏数据。

  3. REPEATABLE READ(可重复读):可避免读脏数据,不可重复读。

  4. SERIALIZABLE(串行化):最高级别,可避免读脏数据、不可重复读、幻读。

 

数据库系统故障的种类

  1. 事务故障:

    是由于程序执行错误而引起事务非预期的、异常终止的 故障。通常有如下两类错误引起事务执行失败:

    • 逻辑错误。如非法输入、找不到数据、溢出、超出资源限制等原 因引起的事务执行失败。

    • 系统错误。系统进入一种不良状态(如死锁),导致事务无法继 续执行。

  2. 系统故障:

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

  3. 介质故障(物理):

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

数据库备份

数据转储是将数据库自制到另一个磁盘或磁带上保存起来的过程,又称为数据备份。

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

  2. 海量转储和增量转储。海量转储是指每次转储全部数据;增量转储是指每次 只转储上次转储后更新过的数据。

  3. 日志文件。在事务处理的过程中,DBMS把事务开始、事务结束以及对数据库 的插入、删除和修改的每一次操作写入日志文件。

  4. 数据库镜像。为了避免磁盘介质出现故障影响数据库的可用性,许多DBMS提 供数据库镜像功能用于数据库恢复

数据库恢复

要使数据库在发生故障后能够恢复,必须建立冗余数据,在故障发生后利用这些冗余数据实施数据 库恢笔,常用的是数据转储和日志文件。

  1. 故障恢复的两个操作:

    • 撤销事务(UNDO):将未完成的事务撤销,使数据库恢复到事务执行前的正确状态。 撤销事务的过程:反向扫描日志文件(由后向前扫描),查找事务的更新操作;对该事务的更 新操作执行逆操作,用日志文件记录中更新前的值写入数据库,插入的记录从数据库中删除,删除 的记录重新插入数据库中;继续反向扫描日志文件,查找该事务的其它更新操作并执行逆操作直至 事务开始标志。

    • 重做事务(REDO):将已提交的事务重新执行。 重做事务的过程:从事务的开始标志起,正向扫描日志文件,重新执行日志文件登记的该事务 对数据库的所有操作,直至事务结束标识。

  2. 故障恢复策略:

    • 事务故障的恢复:事务故障是事务在运行至正常终止点(SUMMIT或ROLLBACK)前终止,日志文 件只有该事务的开始标识而没有结束标识。对这类故障的恢复通常是通过撤销(UNDO)产生故障的事务,使数据库恢复到该事务执行前的正确状态来完成的。

      1. 反向扫描日志文件,查找该事务的更新操作。

      2. 对事务的更新操作执行逆操作。

      3. 继续反向扫描日志文件,查找该事务的其他更新操作,并做同样的处理,直到事务的开始标志。

      注:事务故障的恢复是由系统自动完成的,对用户是透明的

    • 系统故障的恢复:系统故障会使数据库的数据不一致:

      一是未完成的事务对数据库的更新可能已经写入数据库;

      二是已提交的事务对数据库的更新可能还在缓冲区没来得及写入数据库。

      因此对于系统故障,恢复操作是UNDO+REDO

      1. 撤销故障发生时未完成的事务(UNDO)。

      2. 重做已经提交的事务(REDO)。

    • 介质故障的恢复:介质故障时数据库遭到破坏,需要重装数据库,一般需要DBA的参与,装载 故障前最近一次的备份和故障前的日志文件副本,再按照系统故障的恢复过程执行撤销(UNDO)和 重做(REDO)来恢复。

posted @ 2022-05-13 23:20  仙人掌掌掌掌  阅读(337)  评论(0)    收藏  举报