From 795bbe825fcdebef00bf6e6c935cf1d71bb240f5 Mon Sep 17 00:00:00 2001 From: mkelvers Date: Tue, 16 Jun 2026 15:28:17 +0200 Subject: [PATCH] fix: set sqlite txlock=immediate to prevent mid-transaction lock upgrades --- internal/db/sqlite.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/internal/db/sqlite.go b/internal/db/sqlite.go index a336085..c73f35e 100644 --- a/internal/db/sqlite.go +++ b/internal/db/sqlite.go @@ -13,7 +13,9 @@ import ( func Open(dbFile string) (*sql.DB, error) { // busy_timeout avoids immediate SQLITE_BUSY errors under concurrent access. // foreign_keys ensures FK constraints are enforced for this connection. - db, err := sql.Open("sqlite3", fmt.Sprintf("file:%s?_foreign_keys=on&_busy_timeout=5000", dbFile)) + // txlock=immediate acquires SQLite's write lock when a transaction starts, + // which avoids deferred read->write lock upgrades failing mid-transaction. + db, err := sql.Open("sqlite3", fmt.Sprintf("file:%s?_foreign_keys=on&_busy_timeout=5000&_txlock=immediate", dbFile)) if err != nil { return nil, fmt.Errorf("failed to open db: %w", err) }