Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Usage of transactions in :memory: database was broken with #105 #229

Open
epatey opened this issue Jun 24, 2024 · 3 comments
Open

Usage of transactions in :memory: database was broken with #105 #229

epatey opened this issue Jun 24, 2024 · 3 comments

Comments

@epatey
Copy link

epatey commented Jun 24, 2024

#105 regressed in memory databases when transactions are used. Once a transaction is created, the entire in memory database will be effectively discarded for subsequent db operations that the client makes.

From the regressing PR.

  1. A single connection is created lazily whenever user executes a statement
  2. When a transaction starts, the Transaction object takes ownership of the current transaction.
  3. Subsequent queries will create a new connection.

In particular, this line of code from within transaction, null's out this.#db.

Subsequent calls to #getDb will create a new database here. Because it's purely in memory, this essentially creates a new empty database.

I wonder if the fix would be as simple as skipping the dropping/recreating of the Database if path === ':memory'.

@epatey
Copy link
Author

epatey commented Jun 24, 2024

async transaction(mode: TransactionMode = "write"): Promise<Transaction> {
    const db = this.#getDb();
    executeStmt(db, transactionModeToBegin(mode), this.#intMode);
    if (this.#path !== ':memory:') {
        this.#db = null; // A new connection will be lazily created on next use
    }
    return new Sqlite3Transaction(db, this.#intMode);
}

// Lazily creates the database connection and returns it
#getDb(): Database.Database {
    if (this.#db === null && this.$path !== ':memory:') {
        this.#db = new Database(this.#path, this.#options);
    }
    return this.#db;
}

@erkannt
Copy link

erkannt commented Jun 28, 2024

Related? tursodatabase/libsql#1411

@khuezy
Copy link

khuezy commented Aug 15, 2024

This is fixed in 0.9.0 file::memory:?cache=shared

thewilkybarkid added a commit to PREreview/prereview.org that referenced this issue Oct 9, 2024
The tests began to fail when re-enabling transactions as they're incompatible with in-memory SQLite databases. It should be possible to use `file::memory:?cache=shared` rather than `:memory:`, but this also doesn't entirely. To avoid spending more time on this problem, this commit uses temporary file-based databases in the tests.

Refs #1973, 3acf814, tursodatabase/libsql-client-ts#229, https://www.sqlite.org/inmemorydb.html
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants