-
Notifications
You must be signed in to change notification settings - Fork 67
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Handle SQLITE_BUSY gracefully #47
Comments
Interesting. Any idea how long you're holding transactions for? I've considered doing this, but connections are already using (Avoiding long TXs is actually pretty tricky. It requires performing no network blocking actions while holding a transaction.) |
The first easy thing we should do is pass context.Deadline from sqlite.Pool through to the returned connection, so that if user code wants to use a connection for more than 10 seconds, it does not get SQLITE_BUSY calls. (I still think infinite deadlines should be ignored because it's too easy to deadlock.) I've been avoiding a direct context dependency on sqlite because that drags in reflect and the rest of the kitchen sink, which makes life harder on potential tinygo use. So I'm considering:
|
A second motivation for moving the |
I'm playing with these API changes on https://github.com/crawshaw/sqlite/tree/sqlitex |
(I am a little surprised I would actually have 10s write transactions in there, although it was a 600GB database so I suppose it’s possible. I didn’t have the time to look into it yet unfortunately.) |
I'm hitting this on a really small database where I'm fairly certain that I'm not keeping transactions open and with no contention (single process). Any ideas what could be causing this? EDIT: Sorry for the noise, I realize I mixed up |
I'm hitting this without shared cache enabled. I'm definitely using conn for less than the busy timeout value, but I still get SQLITE_BUSY in some cases. With shared cache enabled it doesn't happen as far as I'm aware. |
One common source of this error code is during the upgrade from a read transaction to a write transaction. Switching to |
@zombiezen thanks, I've been researching a lot this topic, and apparently this is indeed a solution. It's a bit inconvenient because the library doesn't offer anything to start the transaction easily. Similar to how SAVEPOINT can be started with Save() would be nice. Or did I miss it? |
There isn't anything in this library AFAIK that helps, but I did end up adding such a function in my fork: |
Now that the shared cache is disabled and WAL-level locking is used directly, I am seeing a lot of errors like
sqlite.Exec: Stmt.Step: SQLITE_BUSY: database is locked
surface to the application.They should be transparently handled by
sqlite3_busy_handler
just likeSQLITE_LOCKED
was handled withsqlite3_unlock_notify
.The text was updated successfully, but these errors were encountered: