Skip to content

Commit

Permalink
libstore: use sqlit3 IMMEDIATE transactions
Browse files Browse the repository at this point in the history
The default transaction behavior (of Sqlite3) is DEFERRED.

DEFERRED means that the transaction does not actually start until the
database is first accessed. Internally, the BEGIN DEFERRED statement
merely sets a flag on the database connection that turns off the
automatic commit that would normally occur when the last statement
finishes. This causes the transaction that is automatically started to
persist until an explicit COMMIT or ROLLBACK or until a rollback is
provoked by an error or an ON CONFLICT ROLLBACK clause. If the first
statement after BEGIN DEFERRED is a SELECT, then a read transaction is
started. Subsequent write statements will upgrade the transaction to a
write transaction if possible, or return SQLITE_BUSY. If the first
statement after BEGIN DEFERRED is a write statement, then a write
transaction is started.

IMMEDIATE causes the database connection to start a new write
immediately, without waiting for a write statement. The BEGIN IMMEDIATE
might fail with SQLITE_BUSY if another write transaction is already
active on another database connection.

source: https://www.sqlite.org/lang_transaction.html#immediate

Because Nix only uses transactions for write operations, changing the
default will allow pushing the SQLITE_BUSY errors early instead of
mid-transaction.
  • Loading branch information
zimbatm committed Oct 19, 2024
1 parent 694c378 commit 6357a7b
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion src/libstore/sqlite.cc
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ bool SQLiteStmt::Use::isNull(int col)
SQLiteTxn::SQLiteTxn(sqlite3 * db)
{
this->db = db;
if (sqlite3_exec(db, "begin;", 0, 0, 0) != SQLITE_OK)
if (sqlite3_exec(db, "begin immediate transaction;", 0, 0, 0) != SQLITE_OK)
SQLiteError::throw_(db, "starting transaction");
active = true;
}
Expand Down

0 comments on commit 6357a7b

Please sign in to comment.