第1课_ACID特性
热度🔥:90 免费课程
授课语音
数据库的事务ACID特性
在数据库管理系统中,事务是指一组操作的集合,这些操作要么全部执行成功,要么在执行过程中发生错误时全部回滚,不会出现部分成功的情况。事务的四个基本特性被称为ACID特性,它们分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。理解这些特性对于确保数据库操作的正确性和可靠性至关重要。
1. 原子性(Atomicity)
原子性意味着事务中的所有操作要么都执行成功,要么都不执行。如果事务中的某一操作失败,之前的所有操作都会被撤销,系统恢复到事务开始之前的状态。原子性保证了事务的完整性,不会出现部分提交的情况。
例如,假设你正在转账操作,从账户A转账100元到账户B。事务的原子性要求,要么转账成功,两个账户的余额都更新,要么转账失败,账户A和账户B的余额都不变。如果操作中途失败,所有的操作都会被撤销。
代码案例:原子性
BEGIN TRANSACTION; -- 开始事务
UPDATE 账户A SET 余额 = 余额 - 100 WHERE 账户编号 = 'A'; -- 从账户A扣除100元
UPDATE 账户B SET 余额 = 余额 + 100 WHERE 账户编号 = 'B'; -- 向账户B增加100元
COMMIT; -- 提交事务
-- 如果其中一个更新失败,可以通过回滚操作恢复原状
-- ROLLBACK; -- 回滚事务
在这个例子中,如果中间有任何一条更新操作失败,所有操作都会被回滚,确保账户A和账户B的余额都不发生变化。
2. 一致性(Consistency)
一致性保证了事务的执行不会破坏数据库的完整性约束。在一个事务执行之前和执行之后,数据库必须保持一致的状态。这意味着每个事务在完成时,数据库会从一个一致的状态转换到另一个一致的状态,遵守所有的数据完整性规则,如外键、主键、检查约束等。
例如,在银行转账操作中,账户余额必须是非负数,即账户余额不能为负。
代码案例:一致性
BEGIN TRANSACTION; -- 开始事务
UPDATE 账户A SET 余额 = 余额 - 100 WHERE 账户编号 = 'A'; -- 从账户A扣除100元
-- 添加一致性检查:确保账户余额不能为负数
IF (SELECT 余额 FROM 账户A WHERE 账户编号 = 'A') < 0 THEN
ROLLBACK; -- 回滚事务
PRINT '余额不足,事务已回滚';
END IF;
UPDATE 账户B SET 余额 = 余额 + 100 WHERE 账户编号 = 'B'; -- 向账户B增加100元
COMMIT; -- 提交事务
在这个例子中,如果账户A的余额不足以进行转账,事务会被回滚,确保数据库保持一致性状态。
3. 隔离性(Isolation)
隔离性保证了多个事务并发执行时,一个事务的执行不会受到其他事务的干扰。每个事务都是独立的,并且事务执行的中间结果对其他事务是不可见的。隔离性通常通过设置事务的隔离级别来实现,常见的隔离级别有:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
不同的隔离级别会对数据库性能产生不同的影响,隔离级别越高,事务之间的干扰越少,但性能可能会受到影响。
代码案例:隔离性
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; -- 设置事务隔离级别为串行化
BEGIN TRANSACTION;
-- 执行事务的操作
UPDATE 账户A SET 余额 = 余额 - 100 WHERE 账户编号 = 'A';
UPDATE 账户B SET 余额 = 余额 + 100 WHERE 账户编号 = 'B';
COMMIT;
在这个例子中,使用了串行化的隔离级别,保证了事务之间不会发生脏读、不可重复读和幻读等问题,所有事务都会按顺序执行。
4. 持久性(Durability)
持久性保证了事务一旦提交,对数据库的修改是永久性的,即使系统发生故障,已提交的事务也不会丢失。事务的修改会永久写入磁盘,确保数据的持久性。数据库通常通过日志系统来实现持久性,当事务提交时,会将修改记录到日志中。
代码案例:持久性
BEGIN TRANSACTION;
UPDATE 账户A SET 余额 = 余额 - 100 WHERE 账户编号 = 'A'; -- 从账户A扣除100元
UPDATE 账户B SET 余额 = 余额 + 100 WHERE 账户编号 = 'B'; -- 向账户B增加100元
COMMIT; -- 提交事务
-- 即使系统发生故障,提交的事务也会被永久保存
在这个例子中,当事务提交后,系统会通过日志机制保证数据的持久性,即使在发生断电等故障的情况下,已提交的事务也不会丢失。
总结
数据库事务的ACID特性是保证数据一致性和可靠性的基石。原子性确保事务中的操作要么全部成功,要么全部失败;一致性保证事务执行前后数据库的完整性;隔离性保证多个事务并发执行时的独立性;持久性确保已提交事务的数据不会丢失。理解和掌握ACID特性是开发和维护高可用、高可靠数据库系统的基础。