关系数据库中的事务通过确保数据完整性和可靠性的机制进行管理,即使在多个操作同时发生时也是如此。 事务是一系列数据库操作(如插入、更新或删除)的集合,被视为一个单一的逻辑单元。 为了保持正确性,数据库遵循 ACID 属性:原子性(所有操作要么全部成功,要么全部失败),一致性(数据库保持有效状态),隔离性(事务之间互不干扰),和 持久性(已完成的事务在系统发生故障后仍然存在)。 例如,在银行账户之间转账需要从一个账户扣款并记入另一个账户——这两个步骤必须都成功,或者都不执行。
数据库使用诸如 BEGIN
、COMMIT
和 ROLLBACK
等事务控制语句来管理事务。 当一个事务开始时,数据库会在临时状态下跟踪更改,直到用户提交。 如果发生错误,事务会回滚,撤消所有更改。 为了实现持久性,数据库使用预写式日志 (WAL),其中更改在应用于实际数据之前会记录到日志文件中。 这确保了崩溃后的恢复。 例如,如果在事务中发生电源故障,数据库可以重放日志以恢复已提交的更改。 隔离性通过锁定(防止并发访问数据)或多版本并发控制 (MVCC) 来处理,MVCC 通过维护数据的多个版本来实现非阻塞读取。
开发人员可以通过诸如 READ COMMITTED
或 SERIALIZABLE
等隔离级别来影响事务行为。 较低的隔离级别(例如,READ UNCOMMITTED
)可以提高性能,但会带来诸如脏读等不一致的风险。 较高的级别(例如,SERIALIZABLE
)可以防止异常,但可能会导致竞争。 例如,电子商务系统可能会使用 REPEATABLE READ
来确保结账期间库存计数保持一致。 死锁(事务无限期地等待彼此的锁)通过中止一个事务来解决。 诸如 SAVEPOINT
等工具允许在事务中进行部分回滚,从而实现更精细的控制。 通过结合这些特性,关系数据库可以平衡真实应用程序的可靠性、性能和可扩展性。