From 7b1f04dc5e42159f5b3372da1e51bc59eed7075d Mon Sep 17 00:00:00 2001 From: Jussi Saurio Date: Wed, 30 Jul 2025 17:00:38 +0300 Subject: [PATCH] pager: only ROLLBACK your own transaction, not if someone else is writing --- core/storage/pager.rs | 6 ++++-- core/vdbe/execute.rs | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/storage/pager.rs b/core/storage/pager.rs index 24ffb9ff5..a5801e594 100644 --- a/core/storage/pager.rs +++ b/core/storage/pager.rs @@ -9,7 +9,7 @@ use crate::storage::sqlite3_ondisk::{ use crate::storage::wal::{CheckpointResult, Wal}; use crate::types::{IOResult, WalInsertInfo}; use crate::util::IOExt as _; -use crate::{return_if_io, Completion}; +use crate::{return_if_io, Completion, TransactionState}; use crate::{turso_assert, Buffer, Connection, LimboError, Result}; use parking_lot::RwLock; use std::cell::{Cell, OnceCell, RefCell, UnsafeCell}; @@ -819,7 +819,9 @@ impl Pager { tracing::trace!("end_tx(rollback={})", rollback); if rollback { self.rollback(schema_did_change, connection)?; - self.wal.borrow().end_write_tx(); + if matches!(connection.transaction_state.get(), TransactionState::Write { .. }) { + self.wal.borrow().end_write_tx(); + } self.wal.borrow().end_read_tx(); return Ok(IOResult::Done(PagerCommitResult::Rollback)); } diff --git a/core/vdbe/execute.rs b/core/vdbe/execute.rs index f25946835..f827e26e2 100644 --- a/core/vdbe/execute.rs +++ b/core/vdbe/execute.rs @@ -2086,6 +2086,7 @@ pub fn op_auto_commit( if *rollback { // TODO(pere): add rollback I/O logic once we implement rollback journal return_if_io!(pager.end_tx(true, schema_did_change, &conn, false)); + conn.transaction_state.replace(TransactionState::None); conn.auto_commit.replace(true); } else { conn.auto_commit.replace(*auto_commit);