Skip to content

Commit

Permalink
Update "database is locked" documentation
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
arp242 committed Jul 4, 2020
1 parent aa77c03 commit 6e600f0
Showing 1 changed file with 12 additions and 6 deletions.
18 changes: 12 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
```
Expand Down

0 comments on commit 6e600f0

Please sign in to comment.