SQLite有5个不同的锁级别 –
http://www.sqlite.org/lockingv3.html:
解锁,共享,保留,待定,独占.
这个问题的重要锁定是共享锁:
“SHARED – The database may be read but not written. Any number of
processes can hold SHARED locks at the same time, hence there can be
many simultaneous readers. But no other thread or process is allowed
to write to the database file while one or more SHARED locks are
active.”
锁是表级的(因此在DB中使用单行执行某些操作时 – 整个表都被锁定).
因此,在选择数据时,不允许其他进程更改数据.
读取数据的锁定步骤为:UNLOCKED→PENDING→SHARED→UNLOCKED(您可以在事务中运行选择).因此,您选择某些内容并且某人将更改数据的情况不会发生.
您的问题是如果您要更新数据库并在同一个表上执行选择会发生什么.在自动提交模式下,写入/更新的锁定机制是:
已解锁→待处理→共享→已保留→待处理→已排除→已解锁.
在Exclusive锁中,没有新的读者(连接)可以连接到数据库.一次只能存在一个EXCLUSIVE锁.然后SQLite将等待,直到读取连接的所有其他PENDING锁被释放,并将阻止任何新的.此时,它将开始写入数据.
所以,我的答案是 – 只要更新过程没有完成,你的其他过程当然会获得旧数据.确保在事务中运行更新,以便不会发生数据不一致. SQLite符合ACID标准,因此不应发生部分更新和包含数据的情况.
一本关于此的好书是“SQLite的权威指南”,特别是“交易”一章.