面试题答案
一键面试读未提交(Read Uncommitted)
- 可能遇到的并发问题:幻读(Phantom Read)。
- 原理:此隔离级别下,一个事务可以读到另一个未提交事务的数据。当一个事务进行插入操作时,另一个并发事务可能读到这些尚未提交的插入数据,仿佛“幻影”一般。比如事务A插入一条新记录,但未提交,事务B此时查询能看到这条记录,若事务A回滚,事务B看到的记录就像幻影一样消失了。
读已提交(Read Committed)
- 可能遇到的并发问题:幻读。
- 原理:该隔离级别保证一个事务只能读到已提交的事务数据。但对于插入操作,当事务A插入数据并提交后,事务B在进行查询时,可能会发现新插入的数据,就像产生了“幻影”数据。因为事务B在查询前,这些数据并不存在,是在事务执行过程中被其他事务插入的。
可重复读(Repeatable Read)
- 可能遇到的并发问题:理论上可避免幻读,但在某些数据库实现(如MySQL Innodb引擎)下,当使用非唯一索引或全表扫描时仍可能出现幻读。
- 原理:在可重复读隔离级别下,事务开始时会创建一个一致性视图,在事务内后续查询都基于这个视图。对于插入操作,若其他事务插入的数据不符合当前事务一致性视图的条件(例如新插入数据的主键在当前事务一致性视图创建时不存在),则当前事务不会读到这些新插入数据,避免了幻读。但如果使用非唯一索引或全表扫描,新插入数据可能符合查询条件从而出现幻读。例如事务A查询某范围数据,事务B在该范围内插入新数据,若事务A再次查询且采用全表扫描等方式,就可能读到事务B插入的数据,出现幻读。
串行化(Serializable)
- 可能遇到的并发问题:无幻读、脏读等并发问题。
- 原理:此隔离级别下,所有事务串行执行,每个事务执行时就像没有其他事务并发执行一样。所以插入操作不会与其他事务产生并发冲突,也就不会出现幻读、脏读等问题。在事务进行插入时,其他事务必须等待该事务完成才能进行操作。