ACID 是数据库事务管理中的四个关键属性,用于确保数据库中的数据在并发操作和异常情况下保持一致性和可靠性。ACID 代表以下四个属性:
原子性(Atomicity):
原子性确保事务中的所有操作要么全部成功执行,要么全部失败回滚。事务是数据库操作的最小单位,不能部分执行。即便系统崩溃,未完成的事务也不会对数据库产生任何影响,所有操作要么完全生效,要么完全无效。
举例:假设你在银行转账,操作包括从一个账户中扣款并向另一个账户存款。原子性确保这两个操作要么都成功执行,要么都回滚。如果发生故障,账户的余额不会发生部分变化。
一致性(Consistency):
一致性保证数据库在事务执行前后保持一致状态。任何事务执行前,数据库处于一致状态,事务执行结束后,也必须处于一致状态。如果事务中发生错误,一致性应该通过回滚操作得到保证。
举例:银行转账时,如果在操作过程中出现问题(如金额计算错误),一致性保证在事务回滚后,账户余额不会变得不一致。
隔离性(Isolation):
隔离性确保并发执行的事务不会互相干扰。即一个事务的中间状态不会对其他事务可见。事务必须独立执行,彼此之间看不到未提交的修改。不同的隔离级别可以提供不同程度的保护,如防止脏读、不可重复读和幻读等。
举例:在银行系统中,如果多个用户同时对同一个账户进行操作,隔离性确保每个用户的操作在其他用户完成之前是不可见的,以防止数据不一致的情况发生。
持久性(Durability):
持久性确保一旦事务提交,数据将被永久保存在数据库中,即使系统崩溃或发生硬件故障,已提交的数据不会丢失。持久性通常依赖于数据库的日志记录和备份机制。
举例:如果你在银行系统中成功完成了一次转账操作,系统崩溃后,转账结果仍然会保存在数据库中,账户的余额不会因为系统崩溃而恢复到转账前的状态。
事务的整体执行流程:
- 事务开始后,它会经历一系列操作(例如,修改、插入、删除等)。
- 在这些操作结束后,系统会检查是否所有的操作都能成功执行。
- 如果所有操作成功,则系统将提交事务,所有数据更改将持久化到数据库中。
- 如果事务中有任何操作失败,则会进行回滚,数据库状态恢复到事务开始前的状态。
ACID 在分布式系统中的挑战:
在单节点数据库中实现 ACID 较为简单,但在分布式系统中实现 ACID 变得更加复杂,因为数据可能分布在多个节点上,需要通过分布式事务协调机制(如两阶段提交协议 2PC、三阶段提交 3PC)来保证 ACID 属性。分布式系统中,通常要在 ACID 和性能、可用性之间做出权衡。