事务与回滚

winterSky 2024-03-20 PM 242℃ 0条

2024-03-20T15:24:54.png

事务

  • 一个事务是一个动作,或一系列动作,由单一用户或应用程序执行,用以读取或更新数据库的内容。
  • 一个事务是一个逻辑工作单元,它将数据库从一个一致状态转换到另一个一致状态。
  • 事务是以下方面的单元:

    • 恢复
    • 一致性
    • 完整性

ACID属性

一个事务必须满足ACID属性:

  • 原子性

    • 事务没有部分
    • 事务不能部分执行
  • 一致性

    • 事务将数据库从一个一致状态转换到另一个一致状态
    • 注意:在事务执行过程中,数据库可能会出现不一致,但最终必须保证一致性!
  • 隔离性

    • 事务的效果在事务完成之前对其它事务不可见
  • 持久性

    • 一旦事务完成,即使系统随后崩溃,其更新也会保留

这些属性确保数据库在处理事务时能够保持数据的完整性和可靠性。原子性意味着事务要么完全执行,要么完全不执行;一致性确保事务完成后数据库仍然保持一致状态;隔离性确保并发事务的执行结果必须与它们序列化执行的结果一致;而持久性意味着一旦事务被提交,它对数据库的更改就是永久的,即使发生系统故障也不会丢失。


ACID示例

  • 事务:“从账户A转账50英镑到账户B”

    1. read(A)
    2. A = A - 50
    3. write(A)
    4. read(B)
    5. B = B + 50
    6. write(B)
  • 原子性:不应该在没有给B钱的情况下从A中扣钱
  • 一致性:总体上没有钱丢失或增加
  • 隔离性:其他查询不应该在事务完成前看到A或B的变化
  • 持久性:钱不会回到A账户

事务管理器

  • 事务管理器执行ACID属性

    • 它安排事务的操作
    • 为了确保原子性,使用COMMIT和ROLLBACK
    • 使用锁或时间戳来确保并发事务的一致性和隔离性
    • 为了在系统失败时确保持久性,会保持一个日志记录

如从一个账户向另一个账户转账。它说明了为了确保这种类型的操作是安全的,数据库需要遵循ACID属性。事务管理器的作用是确保这些属性得到遵守,并且事务能够正确无误地执行。通过提交(COMMIT)和回滚(ROLLBACK)来保证原子性,通过锁或时间戳保证一致性和隔离性,并通过日志记录保证在出现系统故障时数据的持久性。


提交和回滚

  • COMMIT表示事务成功结束

    • 事务所做的任何更改都会被保存
    • 这些更改对其他事务变得可见
  • ROLLBACK表示事务未成功结束

    • 事务所做的任何更改都会被撤销
    • 就像该事务从未发生过一样

恢复

  • 理论上,事务应该是持久的

    • 但实践中我们不能总是预防所有类型的失败,例如:

      • 系统崩溃
      • 电力故障
      • 硬盘崩溃
      • 用户错误
      • 破坏行为
      • 自然灾害

事务日志

  • 事务日志记录所有事务的细节

    • 事务对数据库所做的任何更改
    • 如何撤销这些更改
    • 事务何时以及如何完成
  • 日志存储在磁盘上,不在内存中

    • 如果系统崩溃,日志则会被保留
  • 预写日志规则

    • 日志条目必须在COMMIT之前记录

系统故障

  • 系统故障影响所有运行中的事务

    • 软件崩溃
    • 电力故障
  • 物理介质(磁盘)没有损坏
  • 数据库管理系统在不同时间会进行检查点操作

    • 所有提交的事务都会写入磁盘
    • 会在磁盘上记录当前正在运行的事务

事务日志是数据库恢复机制的重要组成部分,它确保即使在发生系统故障的情况下,也能够恢复事务状态或者撤销未完成的事务。预写日志规则是一种重要的协议,它确保在任何更改被提交到数据库之前,这些更改已经被记录在日志中。系统故障部分强调,尽管软件或硬件故障会影响事务的执行,但是通过定期的检查点和日志记录,数据库可以恢复到最后一个一致的状态,保护数据不受损害。这是保证数据库持久性和一致性的关键措施。


系统恢复

  • 在故障发生时正在运行的任何事务都需要被撤销并重启
  • 自上一个检查点以来已提交的任何事务都需要重新完成

在数据库管理系统中,这意味着当系统恢复后,为了保持数据的一致性和完整性,系统必须能够处理在故障发生时未能完成的事务,以及自上次检查点之后已提交的事务。通过撤销和重启未完成的事务以及重新完成已提交的事务,系统可以确保所有数据都是准确和最新的,从而保持数据库的一致性和持久性。

标签: none

非特殊说明,本博所有文章均为博主原创。

评论已关闭