본문 바로가기
C.W.K.
Stream
Lesson 02 of 10 · published

BEGIN, COMMIT, ROLLBACK

~10 min · transactions, control

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

세 가지 제어 문장

BEGIN 또는 START TRANSACTION이 트랜잭션을 열어. COMMIT은 변경을 다른 세션에 보이고 디스크에 남도록 확정하며, ROLLBACK은 모두 버려. 실제 작업의 99%에서 이 세 명령이면 충분해.

앱에서는 드라이버가 같은 뜻을 감싸

Python의 psycopg에서는 conn.commit()conn.rollback()을 쓰고, SQLAlchemy 세션은 commit()이나 문맥 관리자로 경계를 다뤄. Node의 pg에서는 client.query('COMMIT')client.query('ROLLBACK')을 호출해. 표면 문법만 다를 뿐 의미는 같아.

실패 경로에서 반드시 되돌려

BEGIN 뒤 문장 하나가 실패하면 트랜잭션은 중단 상태에 머물 수 있어. 그 연결을 풀에 돌려보내기 전에 ROLLBACK하지 않으면 다음 요청까지 오류를 물려받아. 예외 처리에서 되돌리기를 빼먹지 마.

Code

Python psycopg의 명시적 트랜잭션·python
import psycopg
with psycopg.connect("postgresql://...") as conn:
    with conn.transaction():
        # 이 블록 안 모든 게 한 트랜잭션.
        conn.execute("UPDATE accounts SET balance = balance - 500 WHERE id = 1")
        conn.execute("UPDATE accounts SET balance = balance + 500 WHERE id = 2")
    # Context exit 에 commit; 예외에 rollback.
Node pg에서 try/catch/finally로 관리하기·javascript
const client = await pool.connect();
try {
  await client.query('BEGIN');
  await client.query('UPDATE accounts SET balance = balance - 500 WHERE id = 1');
  await client.query('UPDATE accounts SET balance = balance + 500 WHERE id = 2');
  await client.query('COMMIT');
} catch (err) {
  await client.query('ROLLBACK');
  throw err;
} finally {
  client.release();
}

External links

Exercise

원하는 언어로 작은 스크립트를 작성해. 트랜잭션을 열고 UPDATE 2개를 실행한 뒤 ROLLBACK해서 아무것도 바뀌지 않았는지 확인해. 같은 스크립트를 COMMIT으로 끝내고 두 변경이 모두 보이는지도 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.