[DBD-SQLite] Concurrency in SQLite

Toby Corkindale toby.corkindale at strategicdata.com.au
Tue Apr 14 01:26:11 GMT 2009

Zbigniew Lukasiak wrote:
> Found this: http://www.reddit.com/r/programming/comments/8bl31/sqlite_can_actually_handle_quite_a_bit_of/
> on reddit today and tried to check that in Perl.
> The errors file contains this line (multiplied):
> DBD::SQLite::db do failed: database is locked(5) at dbdimp.c line 403
> at test.pl line 20.

SQLite doesn't really do locking.. It just runs a sort of busy-wait 
loop, with a 30 second time-out. So if one process holds a transaction 
for >30 seconds, other processes will fail with the error you're seeing.

That said, I had a stress test for SQLite 1.18 which forked off a dozen 
processes which all ran quick actions, and it would still break rapidly 
(with the above error), despite none of the transactions taking more 
than milliseconds.

Also, if you continued to hit sqlite and cause the above error, then 
after a while you could finish the long running transaction, BUT 
dbd::sqlite still thought a transaction was in process, and so no more 
processes could ever get a lock again, until *everything* restarted.

I need to try and find that test and re-run it on 1.19 or 1.20_* to see 
how it goes; but I think I threw it out when cleaning up my home 
directory a while back.

More information about the DBD-SQLite mailing list