트랜잭션을 열었다면 잘 끝내줘야합니다.

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

또한 변경 시도는 모두 유실되며, 트랜잭션을 계속 유지해야하므로 메모리 누수가 발생합니다.

그러므로 꼭… 유의해서 닫도록 합시다.