Hi Ludo, I've checked it some more. The shared cache uses unlock_notify, and the actual database uses sqlite3_busy_handler (sqlite3_busy_timeout) when BUSY is returned. The 5 in ice-9/eval.scm:619:8: Throw to key `sqlite-error' with args `(#f 5 "database is locked")'. ^^ means SQLITE_BUSY, so that's the actual database. So the easiest way to work around it would be to call sqlite3_busy_timeout(db, 10); // ms which would automatically repeatedly retry on busy until 10 ms have accumulated, and only then give up. There's also sqlite3_busy_handler which can be used to install a busy handler, and of course in the future we could also handle SQLITE_BUSY ourselves and yield. See also https://notabug.org/civodul/guile-sqlite3/pulls/4 for the former.