17 事务的特性

在上节中,我们讨论了事务的定义,包括什么是事务以及它在数据库管理系统中的重要性。本节将深入探讨事务的特性,即通常所说的ACID特性。理解这些特性对于有效管理数据库事务至关重要。

1. ACID特性概述

ACID是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)的首字母缩写。以下是对每个特性的详细解释:

1.1 原子性(Atomicity)

原子性确保一个事务中的所有操作要么全部成功,要么全部失败;事务的部分执行是不可接受的。换句话说,事务被视为一个不可分割的单元。

案例: 假设我们有一个银行转账操作,从账户A转100元到账户B。在执行这个操作时,如果在扣款后发生了错误(例如,系统崩溃),那么我们不能让账户A扣款而账户B却没有收到这100元。这时,原子性确保要么两个操作都成功(即扣款和存款),要么都不发生。

在代码层面,可以使用事务控制语句来实现原子性:

1
2
3
4
5
6
BEGIN TRANSACTION;

UPDATE Account SET balance = balance - 100 WHERE account_id = 'A';
UPDATE Account SET balance = balance + 100 WHERE account_id = 'B';

COMMIT;

如果在执行 COMMIT 之前出现了错误,可以使用 ROLLBACK 来撤销所有操作。

1.2 一致性(Consistency)

一致性确保事务在开始前和完成后,数据库都处于一致的状态。所有事务都必须确定数据库在执行它们之前和之后都遵循所有定义的规则和约束。

案例: 在同一银行转账操作的例子中,账户的总余额在扣款和存款之后应该保持一致。如果账户A扣除了100元,账户B则增加了100元,那么在事务完成前后,所有账户的总和应该是不变的。

公式表示: 假设 $T_i$ 表示事务,$S$ 表示数据库状态,$C$ 表示一致性条件,则:

$$
S_{before}(T_i) \Rightarrow C \Rightarrow S_{after}(T_i)
$$

这表示在事务执行前后,必须满足一致性条件C。

1.3 隔离性(Isolation)

隔离性确保多个事务并发执行时,它们之间的操作互不干扰。对于并发执行的事务,它们在执行期间的效果应该与单独执行时一致。不同级别的隔离性可以减少或消除“脏读”、“不可重复读”和“幻读”等现象。

案例: 继续以银行转账为例,如果两个用户几乎同时发起转账操作,操作的结果应该是正确且独立的,不会互相影响。可以通过设定不同的隔离级别来控制事务的隔离性,例如 READ COMMITTED 或 SERIALIZABLE。

代码示例:

1
2
3
4
5
6
7
8
9
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

BEGIN TRANSACTION;

-- 执行转账操作
UPDATE Account SET balance = balance - 100 WHERE account_id = 'A';
UPDATE Account SET balance = balance + 100 WHERE account_id = 'B';

COMMIT;

1.4 持久性(Durability)

持久性确保一旦事务提交,其结果就是永久的,即使系统崩溃或发生故障,已提交的事务所做的更改仍会保留。

案例: 当用户完成转账操作并提交后,不应因为系统崩溃而丢失转账记录。数据库管理系统通常会在提交后将事务的日志写入持久化存储。

在实现持久性时,通常用到事务日志。例如,数据库会记录每个事务的所有更改,并在持久性保障机制下,只要事务一旦 COMMIT,所有更改都会被写入磁盘。

1
2
-- 假设已经在事务中完成了转账操作
COMMIT; -- 这之后,所有的数据变更会被记录在事务日志中

2. 结论

我们讨论了事务的ACID特性:原子性、一致性、隔离性和持久性。这些特性不仅是理解数据库事务的基础,也是实现高效、安全数据管理的关键。在下一节中,我们将探讨如何管理与控制这些事务,以确保它们在实际应用中的正确性和有效性。通过对ACID特性的理解,我们能更好地设计和实现数据库系统,从而确保数据安全与一致性。

作者

IT教程网(郭震)

发布于

2024-08-11

更新于

2024-08-12

许可协议

分享转发

复习上节

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论