面试题答案
一键面试1. 事务ACID特性简述
- 原子性(Atomicity):事务中的操作要么全部完成,要么全部不完成。
- 一致性(Consistency):事务执行前后,数据库从一个合法状态转换到另一个合法状态。
- 隔离性(Isolation):并发执行的事务之间相互隔离,不会互相干扰。
- 持久性(Durability):一旦事务提交,对数据库的修改就会永久保存,即使系统崩溃也不会丢失。
2. WiredTiger存储引擎日志机制概述
WiredTiger使用预写式日志(Write - Ahead Log,WAL)。在对数据文件进行实际修改之前,先将修改操作记录到日志文件中。日志文件以追加的方式写入,这种方式简单且高效,减少了随机I/O操作。
3. 事务与日志机制交互确保ACID特性
- 原子性:
- 事务开始时,WiredTiger会为该事务分配一个唯一的事务标识符(txnid)。
- 对于事务中的每一个操作(如插入、更新、删除),都会在日志中记录一条相应的日志记录,包含操作类型、操作对象及相关数据等信息。
- 如果事务执行过程中发生错误,数据库可以根据日志中的记录进行回滚操作。由于日志记录了事务的所有操作,通过逆向执行这些操作,就可以撤销事务对数据的修改,从而保证原子性。
- 一致性:
- 数据库的一致性通常由应用层和数据库内部的约束(如唯一索引、外键等)来保证。
- 在事务执行过程中,日志记录了事务对数据的修改步骤。如果事务执行完毕且满足所有一致性检查,日志中的记录就成为了数据库状态变迁的可靠记录,确保了从一个一致状态转换到另一个一致状态。
- 隔离性:
- WiredTiger通过多版本并发控制(MVCC)机制与日志配合来实现隔离性。
- 每个事务在读取数据时,根据日志中的版本信息获取相应版本的数据,而不是直接读取最新版本。这样,并发事务之间不会相互干扰,保证了隔离性。
- 日志记录了事务对数据的修改版本,使得在并发环境下,各个事务能看到符合其隔离级别的数据视图。
- 持久性:
- 当事务提交时,WiredTiger会将该事务相关的日志记录刷新到磁盘上的日志文件中。
- 只有在日志成功刷新到磁盘后,事务才算真正提交。这确保了即使系统在事务提交后立即崩溃,在重启时,数据库可以通过重放日志文件中的记录,将未完成的事务回滚,并将已提交的事务重新应用,从而保证了持久性。
- 日志文件的定期归档和检查点机制也有助于确保持久性。检查点操作会将内存中的修改数据刷新到磁盘的数据文件中,并记录此时日志文件的位置。在系统崩溃恢复时,只需从检查点之后的日志记录开始重放,提高了恢复效率。