面试题答案
一键面试1. 锁机制
SQLite 使用锁来实现并发控制,主要有以下几种锁模式:
- 共享锁(SHARED):用于读操作。多个连接可以同时持有共享锁,允许多个并发读操作。例如,当一个连接执行
SELECT
语句时,它会获取共享锁,这样其他连接也可以读取数据,因为共享锁之间不冲突。 - 排它锁(EXCLUSIVE):用于写操作。当一个连接需要修改数据(如
INSERT
、UPDATE
、DELETE
操作)时,它必须获取排它锁。一旦获取排它锁,其他连接既不能获取共享锁也不能获取排它锁,从而阻止了其他读写操作,确保数据修改的原子性。 - 意向锁:包括意向共享锁(INTENT_SHARED)和意向排它锁(INTENT_EXCLUSIVE)。意向锁用于表示一个事务打算在更低层次的对象上获取共享锁或排它锁。例如,当一个事务要在表中的某一行获取排它锁时,它首先会在表级别获取意向排它锁,这样可以让其他事务知道该表有部分数据即将被修改,避免不必要的锁冲突。
2. 写时复制(Copy - on - Write,COW)
- 原理:SQLite 的数据库文件在磁盘上是一个单一的文件。当有写操作发生时,SQLite 并不会直接在原文件上修改数据,而是将需要修改的页面复制到内存中进行修改。只有在事务提交时,修改后的页面才会被写回到磁盘文件中。这意味着在写操作过程中,其他读操作仍然可以从原始的磁盘文件中读取数据,不受写操作的影响。例如,当一个连接执行
UPDATE
语句时,它会将相关的数据页复制到内存,在内存中修改后,等到事务提交时再将修改后的页写回磁盘,而在这期间其他连接可以正常读取磁盘上未修改的数据。
3. 事务机制
- 原子性:SQLite 的事务是原子的,要么全部成功,要么全部失败。当一个事务开始时,SQLite 会记录所有的操作。如果在事务执行过程中发生错误,SQLite 可以通过回滚操作撤销所有已经执行的修改,确保数据库回到事务开始前的状态。例如,一个事务包含多个
INSERT
操作,如果其中一个INSERT
失败,整个事务会回滚,之前插入的数据不会被提交到数据库。 - 一致性:事务机制保证了数据的一致性。在事务执行前后,数据库始终保持在一个一致的状态。所有的约束(如唯一性约束、外键约束等)在事务提交时会被检查,如果违反约束,事务将回滚。
- 隔离性:SQLite 通过锁机制实现事务的隔离性。不同的事务在并发执行时,相互之间不会干扰。例如,一个事务对数据的修改在提交之前,其他事务是看不到的,这确保了并发事务之间的数据独立性。
- 持久性:一旦事务提交,其对数据库的修改会永久保存。即使系统崩溃或重启,已提交的事务对数据库的影响仍然存在。这是通过将修改后的页面写回磁盘以及日志记录等机制来实现的。