사실 데이터베이스 강의를 수강한 큰 이유는 트랜잭션에 대해 잘 알고자 하기 위함이었다. 따라서 SQL 강의중에서 트랜잭션과 관련한 비중이 가장 큰 강의를 수강하였는데.. 결과적으로는 학습내용을 더 보충하여야 하지 않을까 싶다. 일단 트랜잭션에 대해 알아보아야 할 것 같다.
트랜잭션은 데이터베이스에서 상호작용의 단위로, 모든 작업이 성공하거나 모든 작업이 실패해야한다. 보통 대부분 은행 송금과 같은 예제를 많이 사용하므로, 본 글에서도 송금에 대한 예제를 사용하도록 하겠다. 아래와 같이 계좌이체 프로세스가 진행된다고 하자. 발신 계좌에서 송금 금액만큼 차감하고 수신계좌에서 송금금액만큼 추가하는 프로세스가 있을 텐데, 이 때 송금 금액만큼 차감은 진행되었는데, 수신계좌에서 추가하는 프로세스가 실패하였을 경우에 심각한 문제가 발생한다.
1. 발신 계좌에서 송금 금액만큼 차감
2. 수신 계좌에서 송금 금액만큼 추가
따라서 이러한 경우를 방지하기 위하여 트랜잭션을 도입하여야 한다. 또한 트랜잭션은 ACID라는 성질을 갖는다.
Atomic(원자성)
1. 트랜잭션의 연산은 데이터베이스에 모두 반영되든지 아니면 전혀 반영되지 않아야 한다.
2. 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두가 완벽히 수행되지 않았다면 트랜잭션의 작업 전부가 취소되어야 한다.
Consistency(일관성)
1. 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성있는 데이터베이스 상태로 변환한다.
2. 예를 들어 INT형이 STRING 형으로 변환 등이 없이 일관된 상태로 유지해야된다는 것이다.
Isolation(독립성, 격리성)
1. 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산이 끼어들 수 없다.
2. 수행중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.
Durability(영속성, 지속성)
1. 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야 한다.
Raw SQL에서는 아래와 같이 트랜잭션을 실행할 수 있고, ROLLBACK 명령어로 트랜잭션을 취소하거나 COMMIT 명령어로 트랜잭션을 완료할 수 있다.
아래는 그와 관련된 예제이다.
BEGIN TRANSACTION
--SQL Queries~!
COMMIT --OR ROLLBACK