Post-IT
트랜잭션 본문
트랜잭션은 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 논리적 단위를 말합니다. 데이터 베이스의 상태가 변한다는 것은 DML(SELECT, INSERT, UPDATE, 등)을 사용하는 행동을 말합니다. 논리적 단위라는 것은 트랜잭션 안에 모든 작업이 모두 성공하거나 모두 실패해야하는 단위를 말합니다.
데이터베이스는 여러 사용자가 동시에 읽고/쓰는 환경이기 때문에, 중간에 작업이 끊기면 데이터 자체가 꼬일수가 있습니다. 따라서 데이터의 일관성과 무결성을 보장하기 위해 트랜잭션이라는 단위가 필요합니다. 가장 많이 예로 드는 것이 은행 송금입니다. 우리가 송금을 할때 다음과 같은 과정으로 진행됩니다.
- A가 B에게 10만원을 송금합니다.
- A의 계좌에서 10만원이 감소합니다.
- B의 계좌에서 10만원이 증가합니다.
이 과정에서 A의 계좌에서 10만원이 감소하는 과정에서 멈추면 어떻게 될까요? A는 돈을 잃는 사람이 되는 것이죠. 따라서 두 작업을 하나의 트랜잭션으로 묶어서 처리해야 합니다. 성공하면 한번에 성공하고 실패하면 두과정이 모두 실패해야 하죠.
트랜잭션의 특징
트랜잭션은 "ACID"라는 원칙을 따릅니다. 각각 Atomicity(원자성), Consistency(일관성), Isolation(격리성), Durability(지속성)을 의미합니다.
원자성(Atomicity)
트랜잭션에서 원자성은 수행하고 있는 트랜잭션에 의해 변경된 내역을 유지하면서, 이전의 데이터를 임시 보관하고 있습니다. 만약 현재 수행하는 트랜잭션에서 오류가 발생하면 현재 과정을 없애고 이전 상태로 되돌립니다. 이전 데이터가 저장되는 영역을 rollback segment라고 합니다. 트랜잭션이 매우 긴 경우 확실하게 오류가 발생하지 않은 지점부터 다시 작업을 수행할 수 있게 save point를 지정할 수도 있습니다.
일관성(Consistnecy)
트랜잭션에서 작업 처리 결과는 항상 일관성을 보장해야 합니다. 일관성을 보장한다는 것은 데이터의 내용의 글자 제한이 255글자일때, 트랜잭션 수행 후에도 해당 데이터의 글자가 255글자 미만인 상태를 유지해야합니다. 만약 트랜잭션 후에 255글자를 넘긴다면 해당 트랜잭션을 reject 해야합니다. 이러한 일관성은 Trigger를 통해 보장합니다. Trigger는 특정 테이블에 대하여 DML이 수행됐을 때, 데이터베이스에서 자동으로 호출하는 구조로 데이터베이스에서 변경이 일어났을 때, DB에서 강제적으로 연관 DB를 업데이트 해줍니다.
고립성(Isolation)
한 트랜잭션이 수행 시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장해야합니다. 고립성을 보장하기 위해서 Lock & Unlock이라는 기법을 사용합니다. 데이터를 읽거나 쓰기 작업 중에 해당 영역에 Lock을 걸어 다른 트랜잭션이 접근하지 못하도록 하고, 먼저 들어온 트랜잭션의 요청이 끝나면 Unlock하여 다른 트랜잭션이 처리될 수 있도록 허용하는 방식입니다. Lock & Unlock을 잘못 사용하게 되면 Deadlock 상태에 빠질 수 있으니, 유의해서 사용해야 합니다.
지속성(Durability)
성공한 트랜잭션은 영원히 반영되어야 한다. 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행했다면 해당 데이터는 데이터베이스에 영원히 반영 되어야 합니다.