nix icon indicating copy to clipboard operation
nix copied to clipboard

libstore: use sqlit3 IMMEDIATE transactions

Open zimbatm opened this issue 1 year ago • 1 comments

Motivation

Improve the sqlite3 busy situation.

This is still theory and needs testing.

Context

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.

See also https://fractaledmind.github.io/2024/04/15/sqlite-on-rails-the-how-and-why-of-optimal-performance/

Priorities and Process

Add :+1: to pull requests you find important.

The Nix maintainer team uses a GitHub project board to schedule and track reviews.

zimbatm avatar Oct 19 '24 08:10 zimbatm

https://briandouglas.ie/sqlite-defaults/ might also be good to take a look at.

zimbatm avatar Oct 19 '24 08:10 zimbatm

How would one test this? Wouldn't mind trying to set up a test bench to test your theory, I'm just not quite sure what this does/solves.

bryanhonof avatar Nov 04 '24 13:11 bryanhonof