Make concurrent database writes wait instead of failing (closes #253) #258
@@ -20,6 +20,10 @@ regress.
|
|||||||
|
|
||||||
# Completed Steps
|
# 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
|
- 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
|
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
|
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)
|
return fmt.Errorf("failed to create data directory: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open database with WAL mode and foreign keys
|
// Open database with WAL mode and foreign keys. Transactions take the
|
||||||
dsn := dbPath + "?_journal_mode=WAL&_foreign_keys=on"
|
// 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)
|
database, err := sql.Open("sqlite3", dsn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user