事务
- 一个事务是一个动作,或一系列动作,由单一用户或应用程序执行,用以读取或更新数据库的内容。
- 一个事务是一个逻辑工作单元,它将数据库从一个一致状态转换到另一个一致状态。
事务是以下方面的单元:
- 恢复
- 一致性
- 完整性
ACID属性
一个事务必须满足ACID属性:
原子性
- 事务没有部分
- 事务不能部分执行
一致性
- 事务将数据库从一个一致状态转换到另一个一致状态
- 注意:在事务执行过程中,数据库可能会出现不一致,但最终必须保证一致性!
隔离性
- 事务的效果在事务完成之前对其它事务不可见
持久性
- 一旦事务完成,即使系统随后崩溃,其更新也会保留
这些属性确保数据库在处理事务时能够保持数据的完整性和可靠性。原子性意味着事务要么完全执行,要么完全不执行;一致性确保事务完成后数据库仍然保持一致状态;隔离性确保并发事务的执行结果必须与它们序列化执行的结果一致;而持久性意味着一旦事务被提交,它对数据库的更改就是永久的,即使发生系统故障也不会丢失。
ACID示例
事务:“从账户A转账50英镑到账户B”
- read(A)
- A = A - 50
- write(A)
- read(B)
- B = B + 50
- write(B)
- 原子性:不应该在没有给B钱的情况下从A中扣钱
- 一致性:总体上没有钱丢失或增加
- 隔离性:其他查询不应该在事务完成前看到A或B的变化
- 持久性:钱不会回到A账户
事务管理器
事务管理器执行ACID属性
- 它安排事务的操作
- 为了确保原子性,使用COMMIT和ROLLBACK
- 使用锁或时间戳来确保并发事务的一致性和隔离性
- 为了在系统失败时确保持久性,会保持一个日志记录
如从一个账户向另一个账户转账。它说明了为了确保这种类型的操作是安全的,数据库需要遵循ACID属性。事务管理器的作用是确保这些属性得到遵守,并且事务能够正确无误地执行。通过提交(COMMIT)和回滚(ROLLBACK)来保证原子性,通过锁或时间戳保证一致性和隔离性,并通过日志记录保证在出现系统故障时数据的持久性。
提交和回滚
COMMIT表示事务成功结束
- 事务所做的任何更改都会被保存
- 这些更改对其他事务变得可见
ROLLBACK表示事务未成功结束
- 事务所做的任何更改都会被撤销
- 就像该事务从未发生过一样
恢复
理论上,事务应该是持久的
但实践中我们不能总是预防所有类型的失败,例如:
- 系统崩溃
- 电力故障
- 硬盘崩溃
- 用户错误
- 破坏行为
- 自然灾害
事务日志
事务日志记录所有事务的细节
- 事务对数据库所做的任何更改
- 如何撤销这些更改
- 事务何时以及如何完成
日志存储在磁盘上,不在内存中
- 如果系统崩溃,日志则会被保留
预写日志规则
日志条目必须在COMMIT之前记录
系统故障
系统故障影响所有运行中的事务
- 软件崩溃
- 电力故障
- 物理介质(磁盘)没有损坏
数据库管理系统在不同时间会进行检查点操作
- 所有提交的事务都会写入磁盘
- 会在磁盘上记录当前正在运行的事务
事务日志是数据库恢复机制的重要组成部分,它确保即使在发生系统故障的情况下,也能够恢复事务状态或者撤销未完成的事务。预写日志规则是一种重要的协议,它确保在任何更改被提交到数据库之前,这些更改已经被记录在日志中。系统故障部分强调,尽管软件或硬件故障会影响事务的执行,但是通过定期的检查点和日志记录,数据库可以恢复到最后一个一致的状态,保护数据不受损害。这是保证数据库持久性和一致性的关键措施。
系统恢复
- 在故障发生时正在运行的任何事务都需要被撤销并重启
- 自上一个检查点以来已提交的任何事务都需要重新完成
在数据库管理系统中,这意味着当系统恢复后,为了保持数据的一致性和完整性,系统必须能够处理在故障发生时未能完成的事务,以及自上次检查点之后已提交的事务。通过撤销和重启未完成的事务以及重新完成已提交的事务,系统可以确保所有数据都是准确和最新的,从而保持数据库的一致性和持久性。
评论已关闭