SQLite 的并发控制机制是其核心特性之一:
-
锁级别 SQLite 使用不同级别的锁来管理并发访问:
- UNLOCKED:未锁定状态
- SHARED:共享锁,允许多个读操作同时进行
- RESERVED:预留锁,表示准备写入,但仍允许读操作
- PENDING:等待锁,阻止新的读操作,等待现有读操作完成
- EXCLUSIVE:排他锁,独占访问,阻止所有其他操作
-
读写并发模型
- 多读单写:SQLite 支持多个读操作同时进行,但同一时间只允许一个写操作
- 读操作不会阻塞其他读操作
- 写操作需要获得排他锁,会阻塞所有其他操作
-
事务隔离模式
sql-- DEFERRED(默认):第一次读操作时获取共享锁,第一次写操作时升级为排他锁 BEGIN DEFERRED TRANSACTION; -- IMMEDIATE:立即获取预留锁,防止其他写操作 BEGIN IMMEDIATE TRANSACTION; -- EXCLUSIVE:立即获取排他锁,阻止所有其他操作 BEGIN EXCLUSIVE TRANSACTION; -
WAL 模式(Write-Ahead Logging)
- WAL 模式显著提高了并发性能
- 读操作不会阻塞写操作,写操作不会阻塞读操作
- 写操作将更改写入 WAL 文件,而不是直接修改数据库文件
- 检查点(Checkpoint)时将 WAL 文件的内容合并到主数据库文件
-
死锁处理
- SQLite 会自动检测死锁并回滚其中一个事务
- 应用程序应捕获
SQLITE_BUSY错误并重试 - 使用
sqlite3_busy_timeout()设置忙等待超时
-
并发优化建议
- 使用 WAL 模式提高并发性能
- 保持事务简短,减少锁持有时间
- 将读操作和写操作分离到不同的事务中
- 使用适当的隔离模式避免不必要的阻塞
SQLite 的并发控制机制在保证数据一致性的同时,提供了合理的并发性能,适合中小型应用的并发需求。