在SQLite文档中,它声明:
Deferred means that no locks are acquired on the database until the database is
first accessed. Thus with a deferred transaction, the BEGIN statement itself
does nothing to the filesystem. Locks are not acquired until the first read or
write operation.
但是这第一次读或写的时间实际发生了什么?假设我启动延迟事务,然后执行一堆INSERT或UPDATE,然后执行COMMIT。我是否认为在我实际执行提交之前不应该发生第一次写入,或者是否可能在此之前发生写入?
我基本上希望允许多个线程执行由多个插入或更新组成的事务,而不会阻塞其他线程(由于设计完成的方式,如果发生这种情况会导致死锁)。我不关心线程之间插入/更新的顺序,只关注每个集合与单个事务同时完成。
答案 0 :(得分:1)
当您实际从数据库中读取内容时,会发生第一次读取。 第一次写入可以在COMMIT之前发生,如果数据库无法缓存那么多数据,则可以更早。
为防止死锁,您可能需要使用BEGIN IMMEDIATE而不是默认的DEFERRED。
当SQLite发现数据库被锁定时,它只会休眠一段时间并再次尝试。 如果您的访问都来自同一个进程,那么您可以通过在所有写入事务周围使用互斥锁来删除无用的等待并增加并发性。