面试题答案
一键面试1. 读写冲突解决算法及流程
- 检测冲突
- 在PostgreSQL的可串行化快照隔离(SSI)机制下,当一个事务执行读操作时,它会基于当前的快照读取数据。而写操作会在提交时检查是否与其他并发事务存在冲突。
- 具体地,写事务在提交前会对其修改的每个数据项(元组)进行检查。它会检查在该数据项上,是否存在其他并发事务在该写事务开始之后启动的读操作。如果存在这样的读操作,就检测到了读写冲突。
- 解决冲突 - 回滚写事务
- 一旦检测到读写冲突,PostgreSQL通常会选择回滚写事务。这是因为在可串行化隔离级别下,要保证事务的可串行化执行顺序,写操作对数据的修改可能会影响到其他并发读操作的一致性,所以回滚写事务可以避免这种不一致的情况发生。
- 例如,事务T1在修改数据项A,而事务T2在T1开始之后启动并读取了数据项A,当T1提交时检测到这种情况,T1就会被回滚。
2. 事务状态变化
- 正常状态
- 事务开始时处于活动(Active)状态,在这个状态下,事务可以执行各种读写操作。例如,事务T执行一系列的SELECT、UPDATE等语句,此时T处于活动状态。
- 检测到冲突后的状态变化
- 当写事务检测到读写冲突时,它的状态会从活动状态转变为回滚(Rollback)状态。例如上面提到的事务T1检测到冲突后,进入回滚状态。
- 一旦进入回滚状态,系统会撤销该事务对数据所做的所有修改,将数据恢复到事务开始前的状态。完成回滚后,事务进入已终止(Terminated)状态。
3. 日志记录方面
- 预写式日志(WAL)
- PostgreSQL使用预写式日志(Write - Ahead Logging,WAL)机制。在事务执行过程中,所有对数据的修改都会先记录到WAL日志中。例如,事务T1对数据项A进行修改,修改操作会先写入WAL日志。
- 当事务检测到读写冲突并进入回滚状态时,系统会根据WAL日志中的记录来撤销事务对数据的修改。WAL日志包含了足够的信息,如修改前的数据值等,以便进行回滚操作。
- 日志记录的顺序及作用
- WAL日志记录按照事务操作的顺序依次写入。在回滚过程中,系统从最新的日志记录开始,逆向处理日志记录,将数据恢复到事务开始前的状态。例如,如果事务T1依次修改了数据项A、B、C,那么WAL日志中也按此顺序记录,回滚时就按C、B、A的顺序恢复数据。同时,在整个过程中,日志记录也用于崩溃恢复等其他功能,确保系统在故障后能恢复到故障前的一致性状态。