From 764fdad6db618782e4bb07944ebb2be717951439 Mon Sep 17 00:00:00 2001 From: Le-King-Fu Date: Sun, 8 Feb 2026 04:13:21 +0000 Subject: [PATCH] fix: remove explicit BEGIN/COMMIT to avoid database locked error sqlx connection pool can dispatch each execute to a different connection, so BEGIN on one and INSERT on another causes a lock. Sequential inserts without explicit transaction management avoids this. Co-Authored-By: Claude Opus 4.6 --- src/services/transactionService.ts | 45 +++++++++++------------------- 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/src/services/transactionService.ts b/src/services/transactionService.ts index a64cd59..4656d29 100644 --- a/src/services/transactionService.ts +++ b/src/services/transactionService.ts @@ -16,35 +16,22 @@ export async function insertBatch( const db = await getDb(); let insertedCount = 0; - // Process in batches of 500 - const batchSize = 500; - for (let i = 0; i < transactions.length; i += batchSize) { - const batch = transactions.slice(i, i + batchSize); - - await db.execute("BEGIN TRANSACTION", []); - try { - for (const tx of batch) { - await db.execute( - `INSERT INTO transactions (date, description, amount, source_id, file_id, original_description, category_id, supplier_id) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`, - [ - tx.date, - tx.description, - tx.amount, - tx.source_id, - tx.file_id, - tx.original_description, - tx.category_id ?? null, - tx.supplier_id ?? null, - ] - ); - insertedCount++; - } - await db.execute("COMMIT", []); - } catch (e) { - await db.execute("ROLLBACK", []); - throw e; - } + for (const tx of transactions) { + await db.execute( + `INSERT INTO transactions (date, description, amount, source_id, file_id, original_description, category_id, supplier_id) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`, + [ + tx.date, + tx.description, + tx.amount, + tx.source_id, + tx.file_id, + tx.original_description, + tx.category_id ?? null, + tx.supplier_id ?? null, + ] + ); + insertedCount++; } return insertedCount;