第2课_数据库事务的ACID特性
热度🔥:29 免费课程
授课语音
数据库事务的 ACID 特性
在数据库管理系统(DBMS)中,事务(Transaction)是指一组操作(如增、删、改、查)作为一个单元执行,这些操作要么全部成功,要么全部失败。事务的目的是确保数据库操作的一致性、可靠性和稳定性,尤其是在并发和故障的情况下。ACID 是数据库事务的四大基本特性,用于保证数据库事务的正确性和可靠性。
1. 原子性(Atomicity)
原子性要求数据库事务中的所有操作要么全部执行成功,要么在出现错误时全部撤销(回滚)。这意味着事务是一个“原子操作”,不能拆分成更小的部分。如果事务中的某个操作失败,所有已执行的操作都会被回滚,恢复到事务开始之前的状态。
例子: 假设有一个转账操作,包括从账户A扣款和向账户B存款两个操作。如果在向账户B存款前,扣款操作失败了,整个事务会回滚,账户A和账户B的状态都不会发生变化,确保转账操作要么完全成功,要么完全失败。
保证:
- 事务的所有操作必须作为一个不可分割的单元执行。
2. 一致性(Consistency)
一致性要求事务执行前后,数据库的状态必须保持一致。也就是说,事务的执行不能破坏数据库的完整性约束(如主键、外键、唯一性约束等)。每个事务必须使数据库从一个一致的状态转换到另一个一致的状态。
例子: 假设有一个银行账户的余额约束,余额不能为负数。如果某个操作违反了余额不为负数的约束(例如,转账后账户余额为负),则该事务会失败并回滚,确保数据库始终处于有效的状态。
保证:
- 事务前后的数据库状态符合所有的完整性规则和约束条件。
3. 隔离性(Isolation)
隔离性指的是事务的执行不应受到其他事务的干扰。即使多个事务并发执行,每个事务应该像是在独立执行一样,不会受到其他事务的影响。隔离性保证了事务的并发执行不会导致数据的不一致性。
例子: 在多个用户并发进行银行账户转账操作时,隔离性确保每个转账操作不会互相干扰。例如,一个用户的余额更新不应该被另一个用户的操作打断,从而避免出现负数余额或重复扣款的情况。
保证:
- 并发事务的执行结果应该等同于它们按某种顺序串行执行的结果。
隔离级别: 为了实现隔离性,数据库通常支持不同的隔离级别,主要有以下几种:
- 读未提交(Read Uncommitted):最低隔离级别,允许事务读取尚未提交的数据(脏读)。
- 读已提交(Read Committed):保证事务只能读取已提交的数据,避免脏读,但仍可能出现不可重复读。
- 可重复读(Repeatable Read):保证在事务执行期间,每次查询结果都一样,避免脏读和不可重复读,但可能会出现幻读。
- 串行化(Serializable):最高隔离级别,确保事务串行执行,避免脏读、不可重复读和幻读,但性能可能会受到影响。
4. 持久性(Durability)
持久性保证了事务一旦提交,其对数据库的修改就会永久保存,不会因为系统故障(如电力中断、硬盘故障等)而丢失。即使发生崩溃,数据库会恢复到事务提交后的最新状态。
例子: 如果一个转账事务成功提交,即使系统发生崩溃或重启,转账的结果(账户A的余额减少,账户B的余额增加)也不会丢失,会被保留在磁盘中。
保证:
- 提交后的数据会被永久保存到数据库中,能够通过日志、备份等机制恢复。
总结:
- 原子性(Atomicity):事务中的操作要么全部成功,要么全部失败。
- 一致性(Consistency):事务的执行不会破坏数据库的完整性规则,事务前后的数据库状态是一致的。
- 隔离性(Isolation):并发执行的事务相互隔离,互不干扰,避免数据不一致。
- 持久性(Durability):事务一旦提交,修改的数据会永久保存,即使系统发生故障也不会丢失。
这些特性共同作用,保证了数据库系统在面对并发访问、系统故障等复杂情况时,依然能够保持数据的一致性、可靠性和稳定性。