본문 바로가기

삼분공부/DataBase

[DB] commit(), rollback(), release()의 역할

MySQL을 사용할 때 여러 쿼리를 하나의 작업으로 묶어 처리하고 싶을 경우 트랜잭션을 사용한다. 트랜잭션을 사용하면 중간에 에러가 발생했을 때 이전 작업을 모두 취소할 수 있어 데이터 정합성을 보장할 수 있다.

Node.js 환경에서 MySQL 커넥션을 사용한 트랜잭션 처리의 핵심 메서드는 다음과 같다.


1. beginTransaction()

트랜잭션의 시작을 선언하는 메서드이다. 이 시점부터 실행되는 쿼리들은 commit()을 호출하기 전까지 실제로 DB에 반영되지 않는다.

await conn.beginTransaction();

2. commit()

트랜잭션 내에 실행한 모든 쿼리를 실제 DB에 반영하는 메서드이다. 이 명령이 실행되면 트랜잭션은 종료되고, 데이터는 확정적으로 저장된다.

await conn.commit();

3. rollback()

트랜잭션 도중 에러가 발생했을 때, 트랜잭션 내의 모든 변경 사항을 취소하고 이전 상태로 되돌리는 메서드이다. commit()을 호출하지 않은 상태여야 rollback이 가능하다.

await conn.rollback();

 


728x90

4. release()

커넥션 풀을 사용하는 경우, 작업이 끝난 후 커넥션을 풀에 반환하는 메서드이다. 이 메서드를 호출하지 않으면 커넥션 누수가 발생해 나중에 DB 연결이 불가능해질 수 있다.

conn.release();

트랜잭션 전체 예시

const conn = await rds.getConnection();

try {
  await conn.beginTransaction();

  await rds.transactionQuery(conn, "INSERT INTO A ...", [...]);
  await rds.transactionQuery(conn, "INSERT INTO B ...", [...]);

  await conn.commit(); // 최종 반영
} catch (err) {
  await conn.rollback(); // 에러 시 되돌림
  throw err;
} finally {
  conn.release(); // 커넥션 반환
}

 


트랜잭션을 사용할 경우 commit() 또는 rollback() 중 하나는 반드시 호출해야 하며, 이후에는 release()로 커넥션을 반납해야 한다. 이 흐름은 데이터의 안정성과 시스템의 커넥션 자원 관리를 위해 필수적인 구조이다.