Make concurrent database writes wait instead of failing (closes #253) #258
@@ -20,6 +20,10 @@ regress.
|
||||
|
||||
# Completed Steps
|
||||
|
||||
- 2026-10-01: Two database writes at the same moment no longer fail with
|
||||
"database is locked": each transaction now takes the write lock when it begins
|
||||
and waits up to 5 seconds for another writer to finish (#253).
|
||||
|
||||
- 2026-10-01: The hint under the app page's environment variable editor now says
|
||||
changes take effect at the next deploy or rollback, in the page's warning
|
||||
style, instead of asking for a container restart, which keeps the old values
|
||||
|
||||
@@ -137,8 +137,11 @@ func (d *Database) connect(ctx context.Context) error {
|
||||
return fmt.Errorf("failed to create data directory: %w", err)
|
||||
}
|
||||
|
||||
// Open database with WAL mode and foreign keys
|
||||
dsn := dbPath + "?_journal_mode=WAL&_foreign_keys=on"
|
||||
// Open database with WAL mode and foreign keys. Transactions take the
|
||||
// write lock when they begin and wait up to 5s for another writer,
|
||||
// instead of failing with "database is locked" when both write.
|
||||
dsn := dbPath + "?_journal_mode=WAL&_foreign_keys=on" +
|
||||
"&_txlock=immediate&_busy_timeout=5000"
|
||||
|
||||
database, err := sql.Open("sqlite3", dsn)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user