面试题答案
一键面试SQLite支持的事务隔离级别
SQLite 仅支持一种事务隔离级别:READ COMMITTED。
SQLite不支持READ UNCOMMITTED、REPEATABLE READ 和 SERIALIZABLE 等常见级别,原因如下:
- READ UNCOMMITTED:该级别会读取到未提交的数据(脏读),这与SQLite设计初衷不符,SQLite旨在提供可靠、一致的数据读取体验,避免脏读情况。
- REPEATABLE READ 和 SERIALIZABLE:SQLite通过使用行级锁和乐观并发控制策略,保证了在READ COMMITTED级别下就能够有效避免幻读等问题,所以不需要额外实现这两个级别。
不同隔离级别下并发操作影响举例
- READ UNCOMMITTED(SQLite不支持)
- 数据读取影响:事务A可以读取到事务B未提交的数据修改。例如,事务B对某商品价格从100元改为120元,但还未提交,此时事务A读取该商品价格会读到120元。如果事务B最终回滚,事务A读取到的数据就是无效的,这就是脏读。
- 数据写入影响:多个事务可同时修改同一数据,可能导致丢失更新问题。比如事务A和事务B同时读取某库存数量为10,事务A将其减1后未提交,事务B也将其减1后提交,此时库存变为9,但实际上应该变为8,造成数据不一致。
- READ COMMITTED(SQLite支持)
- 数据读取影响:事务只能读取到已提交的数据修改。例如事务B修改商品价格为120元并提交,事务A此时读取才能读到120元,避免了脏读。
- 数据写入影响:会出现不可重复读问题。比如事务A先读取商品价格为100元,此时事务B修改价格为120元并提交,事务A再次读取时价格变为120元,两次读取结果不一致。但不会出现脏读情况,并且在SQLite中通过自身机制避免了幻读。