Sqlite3为了最大程度的提高多线程间的并发访问,采用了锁升级的机制。
未加锁:
还未和数据库建立连接、如果已经建立连接但是还没访问数据库、又或者使用了BEGIN开始了一个事务但未开始读写数据库,处于这些情形时是未加锁状态。
共享锁(又称:读锁)
从数据库中读取数据时,需要申请获得一个共享锁,如果获得成功,则进入共享状态。
预定锁:(预定一个锁,此时先将数据写入缓冲区)
连接需要写数据库时,首先申请一个预留锁,一个数据库同时只能有一个预留锁,预留锁可以与共享锁共存。获得预留锁后进入预留状态,这时会先在缓冲区中进行需要的修改、更新操作,操作后的结果依然保存在缓冲区中,未真正写入数据库。
待定锁:(待定的一个锁,准备提升为排他锁,不允许其他事务申请共享锁不允许读数据,如果在预定锁阶段有事务进入了共享锁那么在待定锁这个阶段需要等共享锁都释放掉)
连接从预留升为排它前,需要先升为未决,这时其它连接就不能获得共享锁了,但已经拥有共享锁的连接仍然可以继续正常读数据库,此时,拥有未决锁的连接等待其它拥有共享锁的连接完成工作并释放其共享锁后,提成到排它锁。
排它锁(又称:写锁):
需要提交修改时,需要将预留锁升为排它锁,这时其它连接都无法获得任何锁,直到当前连接的排它状态结束。
综以上所述,Sqlite3的隔离级别是:读已提交。