面试题答案
一键面试读已提交隔离级别
- 并发写冲突检测与处理
- 锁机制:在写操作开始时,节点会获取写锁。例如,基于共享 - 排他锁(S - X锁)机制,写操作需要获取排他锁。在2PC中,协调者会向所有涉及写操作的节点发送预提交请求。如果某个节点无法获取写锁(因为其他节点已经持有写锁),则该节点会向协调者返回失败响应。协调者收到任何一个失败响应,就会取消整个事务。
- 版本控制:每个数据项都有一个版本号。写操作前,节点读取数据项的版本号,并在写操作完成后更新版本号。在预提交阶段,节点会再次检查数据项版本号。如果版本号与开始写操作时读取的版本号不一致,说明数据已被其他事务修改,该节点会向协调者返回失败响应,事务回滚。
- 对性能和可用性的影响
- 性能:锁机制会导致一定程度的锁竞争,特别是在高并发场景下,可能会增加事务等待时间,降低系统的吞吐量。版本控制需要额外的元数据管理,每次读写操作都需要处理版本号,增加了系统开销。
- 可用性:由于只要有一个节点检测到冲突就回滚整个事务,在高并发写场景下,事务回滚的概率增加,系统可用性可能降低。但从数据一致性角度看,能保证读取到已提交的数据。
可重复读隔离级别
- 并发写冲突检测与处理
- 锁机制:与读已提交类似,使用排他锁进行写操作。不同的是,在事务开始时,对于事务中要读取的数据就获取共享锁,并且在事务结束前一直持有。这样在事务执行过程中,其他事务不能对这些数据进行写操作。在2PC预提交阶段,如果某个节点发现锁冲突(例如,有其他事务正在对其要写的数据持有共享锁),则向协调者返回失败响应,事务回滚。
- 版本控制:除了数据项版本号,还可以引入事务版本号。每个事务开始时分配一个唯一的版本号。写操作时,节点记录当前事务版本号与数据项版本号的关联。在预提交阶段,节点检查数据项版本号与事务开始时记录的版本号是否匹配。如果不匹配,说明数据在事务执行过程中被其他事务修改,事务回滚。
- 对性能和可用性的影响
- 性能:锁机制中,由于事务长时间持有锁,锁竞争会更加严重,事务等待时间更长,大大降低了系统吞吐量。版本控制方面,维护事务版本号等额外元数据增加了系统开销。
- 可用性:由于严格的锁机制和版本控制检查,事务回滚概率进一步增加,在高并发场景下,系统可用性会显著降低。但能确保在同一事务内多次读取数据的一致性。