跳转到内容

主内存数据库系统/事务设计

来自维基教科书,开放的书籍,开放的世界

目录


第 7 章:事务管理

事务是包含许多数据库操作的基本工作单元。事务要么提交,要么回滚。这意味着它应该决定是将所有更改提交给 DBMS,还是忽略所有更改并将数据库状态恢复到事务开始时的状态。

事务阶段

[编辑 | 编辑源代码]

为了恢复目的,DBMS 应该维护事务的状态。事务状态变化如下所示

  • 事务开始
  • 数据库操作(INSERT、UPDATE、DELETE、SELECT)
  • 提交或中止

数据库操作包括读取和修改数据记录。运行 SELECT 语句的效果是读取,运行 INSERT、UPDATE 和 DELETE 的效果是修改数据记录。

提交操作通知事务管理器事务已成功结束。提交操作后,数据库应该处于一致状态,该事务进行的所有更新都应该永久生效。

回滚或中止操作通知事务管理器事务中某个操作出错,并且数据库处于不一致状态。必须对数据库撤销该事务所做的所有更新,以将其恢复到以前的一致状态;即该事务开始时的状态。

资金转账的事务伪代码

[编辑 | 编辑源代码]

BEGIN TRANSACTION;

读取账户 1 余额

如果读取失败,转到 UNDO;

从账户 1 余额中减少 100 元

如果减少失败,转到 UNDO;

读取账户 2 余额

如果读取失败,转到 UNDO;

在账户 2 余额中增加 100 元

如果增加失败,转到 UNDO;

COMMIT;

转到 FINISH;

UNDO

ROLLBACK;

FINISH

RETURN;

事务属性

[编辑 | 编辑源代码]

事务处理保证四个重要属性(称为 ACID 属性)

原子性 — 每个事务都被视为要么全部完成,要么全部不完成 - 它要么提交,要么中止。如果事务提交,则其所有效果都将保留。如果它中止,则所有效果都将被撤销。

一致性 — 事务保持数据一致性;它始终将数据库从一种一致状态转变为另一种一致状态。中间状态可能不一致,但提交或回滚操作应再次将数据库带到另一个新的状态或返回到旧的 一致状态。

隔离性 — 事务应该彼此隔离。即使所有事务都并行运行,一个事务所做的更新也不应该在其他事务提交之前对其他事务可见,反之亦然。

持久性 — 事务提交应确保其更新存在于数据库中,即使发生后续的系统崩溃也是如此。

正确性原则

[编辑 | 编辑源代码]

如果事务在没有其他事务或系统错误的情况下执行,并且它从一致状态的数据库开始,则当事务结束时数据库也处于一致状态。这意味着,如果我们控制并发事务和系统错误,事务始终确保正确性。前者由并发管理器控制,后者由日志和恢复管理器控制。

华夏公益教科书