I have always been a big fan of SQLite and recently was using it with Go/Golang. However due to fact that goroutines are very convenient I quickly ran into the “database is locked” issue where multiple writes would try to update the database at any one time. Multiple reads worked without issue.
I could have solved this by throwing a mutex lock around the database writes, but thats something I could easily mess up by missing the mutex and locking the database at the wrong time. I could also have retries with a backoff which isn’t a bad idea for resilience, but overkill for my situation.
A better solution and one that is hard to search for online is to limit the number of open connections.
db.SetMaxOpenConns(1);
Setting the above after getting your SQLite database connection will totally resolve the issue. It does in theory lower your read performance, but my brief tests to confirm/deny this didn’t indicate any major difference for the sort of load I am expecting.
I was curious about how common this was and checked against searchcode.com 1 and 2. Rather unsurprisingly it seems like a common thing.
Since I had a great deal of issues finding a simple resolution to the problem I thought this post might help someone else.