【SQLite3】渐进式锁机制
SQLite3 使用一种精心设计的渐进式锁机制来管理并发访问,确保数据一致性和事务的 ACID 特性(主要是隔离性和原子性)。它的锁不是传统意义上的“读锁”或“写锁”对象,而是数据库连接在特定时刻所处的锁状态。这些状态是层次化的,连接必须按顺序提升锁状态。
以下是 SQLite3 中的主要锁状态(按从低到高的顺序),它们的作用以及引入的原因:
-
UNLOCKED
(无锁)- 作用: 数据库连接当前没有持有任何锁。这是连接的初始状态和事务结束后的状态。
- 引入原因: 这是基准状态。连接在不与数据库交互时自然处于此状态,不阻止任何其他操作。
-
SHARED
(共享锁 - S)- 作用:
- 允许连接读取数据库文件(执行
SELECT
语句)。 - 允许多个连接同时持有
SHARED
锁。这是实现读并发的关键。 - 阻止任何连接获取
RESERVED
或EXCLUSIVE
锁(即阻止任何写入开始或进行)。
- 允许连接读取数据库文件(执行
- 引入原因:
- 支持并发读取: 允许多个读取器同时访问数据库,极大地提高了只读操作的吞吐量。这是数据库系统的基本需求。
- 隔离读操作: 确保在读取过程中,不会有写入操作改变它正在读取的数据(在
READ COMMITTED
或READ UNCOMMITTED
隔离级别下可能不完全保证可重复读,但至少保证读取时数据文件是稳定的)。 - 防止脏读: 阻止读取器看到未提交的写入(因为写入需要
RESERVED
或更高锁,而SHARED
锁会阻止其获取)。
- 作用:
-
RESERVED
(预留锁 - R)- 作用:
- 表示连接
- 作用: