트랜잭션을 열었다면 잘 끝내줘야합니다.
3/16/2025, 7:18:21 PM
TRANSACTION, COMMIT, ROLLBACK
트랜잭션이란?
트랜잭션은 데이터베이스에서 하나의 논리적인 작업 단위를 의미하며, 모든 작업이 성공해야만 최종적으로 데이터가 변경되도록 보장하는 일관성, 무결성을 보장하는 작업 단위입니다.
트랜잭션을 열고 닫지 않는 경우
트랜잭션은 보통 열게 되면 꼭 닫아줘야합니다. 특히 SQLite3는 한 번에 하나의 트랜잭션만 지원됩니다.
트랜잭션을 열었다면 잘 종료시켜주는 것이 중요합니다.
문제가 아주 잘 보이도록 문제의 코드를 압축시켜 보겠습니다.
try {
await db.run("BEGIN TRANSACTION;");
/**
* 여러 줄의 비즈니스 로직들..
**/
if(condition) {
await db.run("COMMIT;");
}
} catch (error) {
await db.run("ROLLBACK;");
}
위 코드의 문제점은 특정 condition
이 만족했을 경우 혹은 catch
문으로 빠진 경우에만
열어둔 transaction
을 닫아준다는 것입니다.
try {
await db.run("BEGIN TRANSACTION;");
/**
* 여러 줄의 비즈니스 로직들..
**/
if(condition) {
/** condition이 truthy 한 경우에만 진행 할 CRUD 작업 */
}
/** condition과 무관하게 COMMIT */
await db.run("COMMIT;");
} catch (error) {
await db.run("ROLLBACK;");
}
아주 단순한 실수지만 트랜잭션이 닫히지 않는다면
SQLite는 WRITE LOCK
을 걸어둔 상태로 유지합니다.
해당 테이블에 접근하면 아래와 같은 에러를 받습니다.
SQLITE_BUSY: database is locked
또한 변경 시도는 모두 유실되며, 트랜잭션을 계속 유지해야하므로 메모리 누수가 발생합니다.
그러므로 꼭… 유의해서 닫도록 합시다.