数据库管理系统 - 事务:理解基础及其之外

你好,未来的数据库大师们!我很兴奋地带你们进入数据库事务的迷人世界。作为你们亲切的计算机科学老师,我见过无数学生在这个主题上挣扎,但我向你保证,在这个教程结束时,你将成为事务专家!让我们开始吧!

DBMS - Transaction

什么是事务?

在我们深入了解之前,让我们从基础开始。想象你正在ATM机上取钱。你插入卡片,输入PIN码,选择金额,然后取出现金。从开始到结束的整个过程就是一个事务。在数据库术语中,事务是一系列操作,它们作为一个单一逻辑单元的工作被执行。

以下是一个事务在伪代码中的简单示例:

开始 TRANSACTION
从 account 表中读取余额 WHERE id = 12345
如果 balance >= 100 THEN
更新 account 表中的余额 SET balance = balance - 100 WHERE id = 12345
支付 100 美元
ELSE
显示 "资金不足"
END IF
提交 TRANSACTION

这个事务确保要么所有步骤都成功完成(钱被取出并且余额被更新),要么都没有(如果资金不足,什么都不会改变)。

ACID 属性

现在,让我们来讨论事务的四个基石,即ACID属性。这些对于在数据库系统中维护数据完整性和一致性至关重要。

原子性

原子性确保事务被视为一个单一、不可分割的单位。要么是全部,要么是全无 - 事务中的所有操作要么全部成功完成,要么一个都不完成。

示例:

开始 TRANSACTION;
更新 accounts 表中的余额 SET balance = balance - 100 WHERE id = 'Alice';
更新 accounts 表中的余额 SET balance = balance + 100 WHERE id = 'Bob';
提交;

如果这个事务的任何部分失败(例如,Bob的账户不存在),整个事务将回滚,Alice的余额将保持不变。

一致性

一致性确保事务将数据库从一个有效状态转变为另一个有效状态。它维护数据库的完整性约束。

示例: 假设我们有一个规则,所有账户的余额都必须是正数。

开始 TRANSACTION;
更新 accounts 表中的余额 SET balance = balance - 200 WHERE id = 'Alice';
-- 如果 Alice 的余额变为负数,事务将被中止
提交;

隔离性

隔离性确保并发执行事务使数据库处于与顺序执行这些事务相同的最终状态。

示例: 想象两个并发运行的事务:

-- 事务 1
开始 TRANSACTION;
更新 accounts 表中的余额 SET balance = balance - 100 WHERE id = 'Alice';
-- 在这里发生一些延迟
更新 accounts 表中的余额 SET balance = balance + 100 WHERE id = 'Bob';
提交;

-- 事务 2
开始 TRANSACTION;
从 accounts 表中选择余额 WHERE id = 'Alice';
提交;

隔离性确保事务2将看到Alice的余额要么是在转账之前,要么是在转账之后,但永远不会在中间状态。

持久性

持久性保证一旦事务被提交,即使发生电源故障、崩溃或错误,它也将保持如此。

示例: 在执行以下事务后:

开始 TRANSACTION;
将 ('User login', CURRENT_TIMESTAMP) 插入 audit_log 表的 action 和 timestamp 列;
提交;

插入的记录即使在系统崩溃后也会持久存在。

可串行化

可串行化是事务之间隔离性的最高级别。它确保并发执行事务的结果与按照某种顺序串行执行这些事务得到的数据库状态相同。

让我们看一个例子:

事务 1: R(X), W(X)
事务 2: R(X), W(X)

可能的串行调度:

  1. T1 后跟 T2: R1(X), W1(X), R2(X), W2(X)
  2. T2 后跟 T1: R2(X), W2(X), R1(X), W1(X)

如果一个并发调度与其结果等效于上述任一串行调度,则它是可串行化的。

等价调度

两个调度被认为是等价的,如果:

  1. 它们涉及相同的事务集
  2. 它们以相同的方式对非中止事务的冲突操作进行排序

让我们看一个例子:

调度 1: R1(X), R2(X), W1(X), W2(X) 调度 2: R2(X), R1(X), W1(X), W2(X)

这些调度是等价的,因为冲突操作(W1(X) 和 W2(X))在两个调度中的顺序相同。

事务的状态

事务在其生命周期中经历不同的状态。下面是一个总结这些状态的表格:

状态 描述
活跃 初始状态;事务在执行过程中保持此状态
部分提交 在执行最后一个语句后
失败 在发现正常执行无法继续后
中止 在事务回滚并将数据库恢复到事务开始前的状态后
提交 在事务成功完成后

理解这些状态对于有效地管理事务并确保数据完整性至关重要。

总之,事务是数据库管理系统中的基本概念,确保数据一致性和完整性。通过理解ACID属性、可串行化、等价调度和事务状态,你已经在成为数据库专家的道路上迈出了重要的一步!

记住,熟能生巧。尝试在真实的数据库系统中实现这些概念,你会发现事务有多么强大。祝你好运,未来的数据库管理员!

Credits: Image by storyset