对Sqlite3的锁机制简单分析,本人新手,欢迎大家指正。
sqlite用五种锁实现ACID:
1. Nolock:应用处于初始状态
2. Shared:在读操作前获得的锁。(可以有多个应用共享Shared lock)
3. Reserved:表示应用将来有写的意图。(此时其他应用可以获得Shared lock)
4. Pending:表示应用正在因为要执行写操作而等全部Shared lock释放。(此时其他应用不能再获得任何锁)
5. Exclusive:表示应用已经获得锁并在执行写操作。(此时其他应用不能再获得任何锁)
[一次仅有读的事务具有以下锁转换过程]:
Nolock->Shared->Nolock
应用要启动事务读数据,那么首先要尝试获得shared lock,此时如果没有其他应用处于Pending或Exclusive,那么可以顺利完成读任务,并在提交以后释放锁,回到Nolock状态。
[一次有写的事务具有以下锁转换过程]:
Nolock->Shared->Reserved->Pending->Nolock
应用要启动事务写(读写)数据,那么首先要尝试获得shared lock,在获得shared lock以后,可以执行读操作。当应用调用写函数以后,并且还没有执行提交以前,会尝试获得Reserved lock,此时如果没有其他应用处于Reserved,Pending或Exclusive&#x