[DB] 트랜잭션(Transaction)에 대해서 알아보자.
데이터베이스 트랜잭션(Transaction)은 정보 시스템에서 핵심적인 개념으로, 데이터의 안전하고 일관된 상태를 유지하는데 중요한 역할을 합니다. 이는 마치 금융 거래에서의 금액 이체가 진행될 때, 돈을 보내주는 사람의 통장에서 금액이 출금되고, 돈을 받는 통장에서 금액이 입금되는 일련의 작업을 의미합니다. 데이터의 정확성과 신뢰성을 보장하기 위하여 트랜잭션이 무엇인지, 어떤 속성을 따르는지 자세히 알아보겠습니다.
트랜잭션이란?
트랜잭션(Transcation) 이란 여러개의 작업을 하나로 묶은 실행 유닛을 말하며, 데이터베이스 관점에서는 데이터베이스의 상태를 변환시키는 기능을 수행하기 위한 하나 이상의 쿼리를 모아 놓은 하나의 작업 단위를 말합니다.
한 번에 수행되어야 하는 일련의 데이터베이스 작업들이 트랜잭션의 단위로 묶이게 되며, 이 작업들은 성공적으로 완료되거나 전혀 수행되지 않아야 합니다. 만약 질의(query)를 하나의 묶음 처리해서 중간에 실행이 중단됐을 경우, 처음부터 다시 실행하는 Rollback을 수행하고, 오류없이 실행을 마치면 commit을 하는 실행 단위를 의미합니다. 즉, 한 번 질의가 실행되면 질의가 모두 수행되거나 모두 수행되지 않는 작업수행의 논리적 단위입니다.
트랜잭션의 속성 : ACID
트랜잭션의 4가지 특성의 맨 앞에 글자를 따서 ACID 특성이라고 부릅니다. ACID는 원시성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 나타냅니다.
원시성 (Atomicity)
- 트랜잭션의 작업이 부분적으로 실행되거나 중단되지 않는 것을 보장하는 것을 말합니다.
- All or Nothing 의 개념으로서 작업 단위를 일부분만 실행하지 않는다는 것을 의미합니다.
일관성 (Consistency)
- 트랜잭션이 성공적으로 완료되면 일관적인 DB 상태를 유지하는 것을 말합니다.
- 일관성은 트랜잭션 작업 처리의 결과가 항상 일관되어야 한다를 뜻합니다.
격리성 (Isolation)
- 트랜잭션 수행 시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장하는 것을 말합니다.
- 즉, 트랜잭션은 독립적이라 서로 간섭이 불가능합니다.
- 격리성이라고 하거나 독립성이라고도 부릅니다.
지속성 (Durability)
- 트랜잭션이 성공적으로 완료되면 결과가 영원히 반영되는 것을 말합니다.
- 일반적으로 commit 을 하면 현재 상태는 영원히 보장됩니다.
Commit 과 Rollback
트랜잭션의 Commit 과 Rollback 은 트랜잭션의 성공적인 완료 또는 실패 시에 수행되는 두 가지 중요한 연산입니다.
Commit
Commit은 트랜잭션에서의 모든 변경 사항을 영구적으로 데이터베이스에 적용하는 연산입니다. 즉, 트랜잭션이 성공적으로 완료되었고 데이터베이스의 일관성과 지속성이 보장된 경우, Commit을 수행하여 트랜잭션에서 수행한 모든 작업을 데이터베이스에 반영합니다.
예를 들어, 금액 이체 트랜잭션이 모든 단계를 정상적으로 완료하면, 해당 트랜잭션에 대해 Commit을 호출하여 이체 작업이 최종적으로 적용되도록 할 수 있습니다.
Rollback
트랜잭션 중에 오류가 발생하거나 트랜잭션을 중단해야 할 때 사용됩니다. Rollback은 트랜잭션에서 수행한 모든 변경을 취소하고 이전 상태로 데이터베이스를 되돌립니다. 트랜잭션 중 어떤 시점에서든 Rollback이 호출되면, 해당 트랜잭션의 모든 작업은 취소되어 일관성 있는 상태를 유지할 수 있습니다.
예를 들어, 데이터베이스에 잘못된 정보를 입력한 경우나 예상치 못한 예외가 발생한 경우, Rollback을 통해 트랜잭션을 중단하고 데이터베이스를 이전 상태로 복원할 수 있습니다.
트랜잭션 상태
상태 | 설명 |
실행 (active) | 트랜잭션이 시작되어 여러 작업을 수행 중인 상태입니다. |
부분 완료 (partially committed) | 트랜잭션이 모든 작업을 성공적으로 마쳤지만, 아직 영구적으로 반영되지 않은 상태입니다. 즉, 트랜잭션의 COMMIT 이전 SQL문이 수행되고, COMMIT 만 남은 상태를 말합니다. |
완료 (committed) | 트랜잭션이 성공적으로 완료되어 모든 변경 사항이 데이터베이스에 영구적으로 반영된 상태입니다. |
실패 (failed) | 트랜잭션이 오류로 중단되거나 실패한 상태로, 변경 사항이 롤백되고 트랜잭션이 종료됩니다. |
철회 (aborted) | 트랜잭션이 취소되고, 트랜잭션 실행 이전 데이터로 돌아간 상태를 말합니다. 즉, 트랜잭션 수행을 실패하고 ROLLBACK 연산을 실행한 상태입니다. |
트랜잭션 사용 시 주의점
트랜잭션을 사용할 때 주의해야할 점이 있습니다.
트랜잭션 범위의 적절한 설정
- 트랜잭션은 가능한 한 빠르게 실행되어야 하므로, 트랜잭션의 범위를 필요 이상으로 크게 가져가지 않는 것이 중요합니다.
- 큰 범위의 트랜잭션은 데이터베이스 락을 오랫동안 유지할 수 있으며, 다중 사용자 환경에서 성능 문제를 발생시킬 수 있습니다.
트랜잭션 실행 시간 최소화
- 트랜잭션 실행 시간이 길어질수록 데이터베이스 락이 오래 유지되므로, 트랜잭션을 가능한 한 빨리 실행하여 락을 최소화해야 합니다.
데이터베이스 락에 대한 이해
- 락은 다른 트랜잭션이 해당 데이터에 접근하는 것을 막는 역할을 합니다.
- 트랜잭션 실행 동안에는 데이터베이스 락이 걸릴 수 있습니다.
- 락을 효과적으로 관리하여 다중 사용자 환경에서 성능과 동시성을 유지하는 것이 중요합니다.
예외 처리
- 트랜잭션 실행 중에 예외가 발생할 수 있습니다.
- 예외가 발생하면 트랜잭션을 롤백하고 적절한 오류 처리를 수행해야 합니다.
고립성 수준 이해
- 트랜잭션의 고립성 수준을 이해하고 설정하는 것이 중요합니다.
- 고립성 수준은 동시에 여러 트랜잭션이 실행될 때의 데이터 일관성을 제어하는데 영향을 미칩니다.
트랜잭션 로그 관리
- 트랜잭션 로그는 데이터베이스의 변경 내용을 기록하는 데 사용됩니다.
- 로그를 적절히 관리하여 데이터 복구와 관련된 문제를 방지해야 합니다.
자동 커밋 주의
- 일부 데이터베이스 시스템에서는 기본적으로 SQL 문을 자동으로 커밋하는 설정이 있을 수 있습니다.
- 이 설정에 대한 이해가 필요하며, 트랜잭션의 명시적인 커밋과 롤백을 확인해야 합니다.
참고 페이지