diff --git a/pkg/database/database.go b/pkg/database/database.go index 658b2bdf6..e4099b073 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "os" + "sync" "time" "github.com/fvbommel/sortorder" @@ -20,6 +21,7 @@ import ( ) var DB *sqlx.DB +var WriteMu *sync.Mutex var dbPath string var appSchemaVersion uint = 19 var databaseSchemaVersion uint @@ -63,6 +65,7 @@ func Initialize(databasePath string) bool { const disableForeignKeys = false DB = open(databasePath, disableForeignKeys) + WriteMu = &sync.Mutex{} return false } @@ -77,6 +80,7 @@ func open(databasePath string, disableForeignKeys bool) *sqlx.DB { conn, err := sqlx.Open(sqlite3Driver, url) conn.SetMaxOpenConns(25) conn.SetMaxIdleConns(4) + conn.SetConnMaxLifetime(30 * time.Second) if err != nil { logger.Fatalf("db.Open(): %q\n", err) } diff --git a/pkg/sqlite/transaction.go b/pkg/sqlite/transaction.go index 8ec0fd5d2..50016db45 100644 --- a/pkg/sqlite/transaction.go +++ b/pkg/sqlite/transaction.go @@ -176,17 +176,15 @@ func (t *ReadTransaction) Tag() models.TagReader { } type TransactionManager struct { - // only allow one write transaction at a time - c chan struct{} } func NewTransactionManager() *TransactionManager { - return &TransactionManager{ - c: make(chan struct{}, 1), - } + return &TransactionManager{} } func (t *TransactionManager) WithTxn(ctx context.Context, fn func(r models.Repository) error) error { + database.WriteMu.Lock() + defer database.WriteMu.Unlock() return models.WithTxn(&transaction{Ctx: ctx}, fn) }