From 6e600f0269e889c66e6e40f4d9aba6ad1eec95f0 Mon Sep 17 00:00:00 2001 From: Martin Tournoij Date: Sat, 4 Jul 2020 12:53:53 +0800 Subject: [PATCH] Update "database is locked" documentation 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. --- README.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index fd0c0203..beacff32 100644 --- a/README.md +++ b/README.md @@ -526,17 +526,23 @@ For an example see [dinedal/go-sqlite3-extension-functions](https://github.com/d - Error: `database is locked` - When you get a database is locked. Please use the following options. + This means two different connections are trying to write to the database at + the same time. - 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 + reads, even when writing). + + Adding `_journal_mode=wal` improves the general concurrency in most cases, + although it doesn't 100% eliminate locking issues: - Example: ```go - db, err := sql.Open("sqlite3", "file:locked.sqlite?cache=shared") + db, err := sql.Open("sqlite3", "file:locked.sqlite?_journal_mode=wal") ``` - 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 + the maximum number of database connections to `1`: + ```go db.SetMaxOpenConns(1) ```