Module 06 · Bonus Module: Advanced SQL for Data Engineers
ACID TransactionsACID 事务
欢迎观看本视频,了解 ACID 事务。
观看本视频后,您将能够:
- 解释什么是 ACID 事务。
- 举例说明 ACID 事务。
- 描述提交 (Commits) 和回滚 (Rollbacks)。
事务的定义 (Definition of a Transaction)
事务是一个不可分割的工作单元。
- 它可以包含一条或多条 SQL 语句。
- 要被认为是成功的,要么所有 SQL 语句都必须成功完成,使数据库处于新的稳定状态;要么所有语句都不能完成,使数据库保持在事务开始之前的状态。
示例:银行卡购物
例如,当您使用银行卡进行购买时,必须发生多件事情:
- 产品必须被添加到您的购物车。
- 您的付款必须得到处理。
- 您的账户必须被扣除正确的金额,同时商店的账户必须被记入相应的金额。
- 该产品的库存必须减少购买的数量。
🔍 示例细化:Rose 购买靴子
如果 Rose 购买了一双价值 $200 的靴子,则需要执行以下操作:
- 使用 UPDATE 语句减少 Rose 账户的余额。
- 使用另一个 UPDATE 语句为鞋店账户增加 $200。
- 使用最后一个 UPDATE 语句将鞋店靴子的库存水平减少 1。
如果这些 UPDATE 语句中的任何一个失败,整个事务都应该失败,以保持数据的一致性状态。
ACID 特性详解
上述示例中的事务类型被称为 ACID 事务。ACID 是四个关键特性的首字母缩写:
| 特性 | 英文 | 解释 |
|---|---|---|
| 原子性 | Atomic | 所有更改必须成功执行,否则一概不执行。 |
| 一致性 | Consistent | 数据在事务执行之前和之后必须处于一致状态。 |
| 隔离性 | Isolated | 在事务运行时,没有其他进程可以更改正在处理的数据。 |
| 持久性 | Durable | 事务所做的更改必须持久存在(即永久保存)。 |
事务的控制:开始、提交与回滚
1. 启动事务
- 要启动一个 ACID 事务,请使用
BEGIN命令。 - 在 DB2 on Cloud 中,此命令是隐式的 (implicit)。
- 此后您发出的任何命令都属于该事务的一部分,直到您发出
COMMIT或ROLLBACK命令为止。
2. 提交 (COMMIT)
- 如果所有命令都成功完成,请发出
COMMIT命令,将所有更改保存到数据库,使其处于一致、稳定的状态。
3. 回滚 (ROLLBACK)
- 如果任何命令失败(例如,Rose 的账户没有足够的钱支付),您可以发出
ROLLBACK命令来撤销所有更改,使数据库恢复到先前的、一致的稳定状态。
应用程序中的 SQL 调用
- SQL 语句可以从 Java、C、R 和 Python 等语言中调用。
- 这需要使用特定于数据库的访问 API,例如 Java 的 JDBC (Java Database Connectivity),或针对 Python 的特定数据库连接器,如 ibm_db。
- 大多数语言使用
EXEC SQL命令来启动 SQL 命令,包括COMMIT和ROLLBACK,如示例所示。记住,
BEGIN是隐式的,您无需显式调用它。 - 将 SQL 命令纳入应用程序代码中,使您有机会创建错误检查例程,进而控制事务是提交还是回滚。
结论回顾
在本视频中,您了解到:
- 事务代表一个完整的工作单元,可以是一条或多条 SQL 语句。
- ACID 事务要求所有 SQL 语句必须成功完成或一概不执行,这确保了数据库始终处于一致状态。
- ACID 代表原子性 (Atomic)、一致性 (Consistent)、隔离性 (Isolated)、持久性 (Durable)。
BEGIN、COMMIT和ROLLBACK等 SQL 命令用于管理 ACID 事务。- SQL 命令可以从 C、R 和 Python 等语言中调用。