Oracle数据库通过一系列技术和机制来确保事务处理符合(Atomicity, Consistency, Isolation, Durability)。
原子性 (Atomicity)
实现方式:
- Undo Log:Oracle使用Undo(撤销)日志来保证原子性。每当事务修改数据时,都会生成对应的Undo记录,保存了原始数据或修改前的状态。如果事务在执行过程中遇到错误或显式地被回滚,Oracle会使用Undo Log恢复数据到事务开始前的状态,确保事务作为一个整体要么完全执行,要么完全不执行。
一致性 (Consistency)
实现方式:
- 事务提交条件检查:当事务尝试提交时,Oracle会检查事务是否导致数据库违反任何完整性约束(如主键、外键、唯一性等),只有当所有更改使得数据库处于一致状态时才会允许提交。
- 触发器与约束:通过数据库对象上的约束和触发器来保证业务规则得到执行,以维持数据库的一致性模型。
- 事务内部逻辑:应用程序开发人员负责编写能在事务内保持一致性的SQL语句集合。
隔离性 (Isolation)
实现方式:
- 多版本并发控制(MVCC):Oracle通过多版本并发控制技术来提供不同程度的事务隔离级别,默认级别是READ COMMITTED,这样在一个事务读取数据时,它看到的是已经提交的数据版本,而不会看到其他未提交事务所做的修改。
- 锁机制:Oracle使用各种类型的锁(例如行级锁、表级锁、页级锁等)来管理不同事务之间的并发访问,防止脏读、不可重复读和幻读等问题的发生。
- Read Consistency:Oracle保证每个查询在执行期间看到的是一个固定的系统状态,即使这个状态可能并非最新的提交状态。
持久性 (Durability)
实现方式:
- Redo Log:Oracle通过重做日志(Redo Log)来保证事务的持久性。事务在提交前,其修改首先会被记录在重做日志文件中。即使在事务提交后系统发生故障,也能通过重播重做日志将已提交事务的更改永久保存到数据库中。
- Checkpoint和LGWR进程:Oracle有一个名为LGWR的后台进程,负责将重做日志缓冲区的内容定期或在事务提交时强制写入磁盘上的重做日志文件,并通过Checkpoint机制同步数据文件,确保事务的修改持久存储。