On Apr 28, 2010, at 10:20 PM, Guillaume Duranceau wrote:

> Hello all,
>
> While running a SQLite transaction writing into the DB (thus holding  
> the
> RESERVED lock), in case the memory cache becomes full, SQLite will  
> try to
> write the content of a dirty page into the DB. To do so, it promotes  
> the
> RESERVED lock to EXCLUSIVE. This can be annoying because afterwards,  
> the
> EXCLUSIVE lock will be released only when the transaction will  
> finally be
> committed. In the meantime, database access to readers will be  
> prohibited.
>
> This behaviour is described at http://www.sqlite.org/lockingv3.html,
> chapter 5.0 "Writing to a database file":
>
> <quote>
> If the reason for writing to the database file is because the memory  
> cache
> was full, then the writer will not commit right away. Instead, the  
> writer
> might continue to make changes to other pages. Before subsequent  
> changes
> are written to the database file, the rollback journal must be  
> flushed to
> disk again. Note also that the EXCLUSIVE lock that the writer  
> obtained in
> order to write to the database initially must be held until all  
> changes
> are committed. That means that no other processes are able to access  
> the
> database from the time the memory cache first spills to disk until the
> transaction commits.
> </quote>
>
> I'm wondering why the EXCLUSIVE lock is not downgraded to a RESERVED  
> lock
> right after writing the dirty page into the DB. This doesn't seem to  
> me as
> an undoable task (the transition EXCLUSIVE->RESERVED would simply  
> need to
> be managed by xUnlock functions), but there might be technical/ 
> conceptual
> reasons preventing to do so. What are your views on this ?

If a reader tried to read the db file after a writer has
started writing out dirty pages but before it has committed
its entire transaction, it would see an inconsistent (and
possibly corrupt) database file.

_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to