-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
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
Update "database is locked" documentation #827
Conversation
This explains a bit more what is going on, removes the recommendation to set cache to shared (which is considered deprecated), and mentions using the WAL.
|
||
Add to DSN: `cache=shared` | ||
One way to fix this is to ensure your program limits the number of writers | ||
to 1, for example by using `sync.Mutex` (it's fine to be have multiple |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Having multiple writers is actually not itself a problem. However, what can cause an issue even with write-ahead logging is if a connection tries to write after reading within a transaction.
tx := database.Begin()
...
tx.QueryRow(`SELECT ID FROM Foo WHERE ...`)
...
tx.Exec(`UPDATE Foo ...`)
...
The problem here is that if the database gets modified between the SELECT
and the UPDATE
by another connection, there is no way for SQLite to properly retain the "isolation" property of ACID. This is because the interim modification may have changed the very data you read out. This issue can be avoided by always using immediate locking behavior (i.e., BEGIN IMMEDIATE
) for any transactions that may ultimately write to the database. (It of course is also avoided by throttling the connection pool to one, provided that no other applications will also be writing to the same database.)
``` | ||
|
||
Second please set the database connections of the SQL package to 1. | ||
|
||
To guarantee only one connection is being run at the same time yoi can set |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To guarantee only one connection is being run at the same time yoi can set | |
To guarantee only one connection is being run at the same time, you can set |
As for me, problem was fixed by closing Rows, as shown on https://stackoverflow.com/a/32483180/321731. |
Kindly ping @arp242 |
This explains a bit more what is going on, removes the recommendation to
set cache to shared (which is considered deprecated), and mentions using
the WAL.