面试题答案
一键面试分布式事务常见隔离级别
- 读未提交(Read Uncommitted):
- 定义:一个事务可以读取另一个未提交事务的数据。
- 2PC下保证一致性和隔离性:在2PC机制下,该隔离级别无法保证事务间的数据隔离性。由于可以读取未提交数据,若在准备阶段后,协调者发生故障,部分参与者可能回滚事务,但其他已读取未提交数据的事务可能继续执行,从而破坏数据一致性。
- 特点:隔离级别最低,并发性能最高。
- 问题:可能出现脏读,即读取到其他事务未提交的数据,若这些数据最终回滚,会导致当前事务数据错误。
- 读已提交(Read Committed):
- 定义:一个事务只能读取已提交事务的数据。
- 2PC下保证一致性和隔离性:在2PC机制中,只有当所有参与者都准备好(第一阶段)且协调者发出提交指令(第二阶段)后,数据才会真正提交并可被其他事务读取。这在一定程度上保证了数据一致性,因为读取到的数据都是已提交的。但如果在提交阶段协调者故障,部分参与者可能已提交,部分未提交,仍可能出现数据不一致。
- 特点:避免了脏读,并发性能相对较高。
- 问题:可能出现不可重复读,即在同一事务内多次读取同一数据,由于其他事务的修改提交,两次读取结果不同。
- 可重复读(Repeatable Read):
- 定义:在一个事务内,多次读取同一数据,其结果保持一致,不受其他事务提交修改的影响。
- 2PC下保证一致性和隔离性:2PC过程中,当事务开始读取数据时,会对读取的数据加锁(锁机制实现)。在事务未完成前,其他事务无法修改这些数据。在2PC两阶段中,准备阶段和提交阶段的数据状态能得到较好控制,确保同一事务内读取数据的一致性。但如果在准备阶段后协调者故障,部分参与者已准备但未提交,可能导致数据长时间锁定,影响并发。
- 特点:避免了脏读和不可重复读。
- 问题:可能出现幻读,即事务在读取范围内,由于其他事务新增数据,导致再次读取时结果集发生变化,虽然数据值本身未变,但整体数据集合不同。
- 串行化(Serializable):
- 定义:事务串行执行,一个事务执行完,另一个事务才开始,不存在并发执行情况。
- 2PC下保证一致性和隔离性:在2PC机制下,由于事务串行执行,不存在并发问题,数据一致性和隔离性得到完全保证。但这种方式性能最差,因为事务排队执行,等待时间长。
- 特点:提供了最高级别的隔离,确保数据一致性和隔离性。
- 问题:并发性能极低,系统吞吐量严重受限,因为事务必须依次执行,无法利用多核等并行资源。