트랜잭션(Transaction)
트랜잭션은 작업의 완정성을 보장해 주는 것이다. 즉, 논리적인 작업을 모두 완벽하게 처리하거나, 또는 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능이다.
사용자 입장에서는 작업을 논리적 단위로 이해할 수 있고, 시스템의 입장에서는 데이터들을 접근 또는 변경하는 프로그램의 단위가 된다.
또한, 트랜잭션에는 여러 개의 연산이 수행될 수 있다.
트랜잭션의 특징
트랜잭션은 다음의 ACID라는 4가지 특성을 만족해야 한다.
- 원자성(Atomicity)
트랜잭션의 결과가 DB에 모두 반영되거나, 혹은 전혀 반영되지 않아야 한다.
만약 트랜잭션 중간에 어떠한 문제가 발생한다면 트랜잭션에 해당하는 어떠한 작업 내용도 수행되어서는 안 되며, 아무런 문제가 발생하지 않을 경우에만 모든 작업이 DB에 반영되어야 한다.
- 일관성(Consistency)
트랜잭션의 작업 처리 결과는 항상 일관성 있어야 한다.
트랜잭션이 일어난 이후의 DB는 DB의 제약조건을 만족해야 한다.
- 격리성(Isolation)
둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 때, 각각의 트랜잭션은 서로 간섭 없이 독립적으로 수행되어야 한다. - 지속성(Durability)
트랜잭션이 성공적으로 완료되었다면, 결과는 영구적으로 DB에 저장되어야 한다.
트랜잭션의 연산
트랜잭션의 연산은 크게 Commit과 Rollback이 있다.
Commit은 하나의 트랜잭션이 성공적으로 종료된 후 DB가 일관성 있는 상태일 때, 결과를 최종적으로 DB에 반영하는 연산이다.
Rollback은 하나의 트랜잭션이 비정상적으로 종료되어 DB의 일관성을 잃었을 때, 트랜잭션이 지금까지 실행한 연산 결과를 모두 취소하고 트랜잭션 수행 이전의 상태로 돌아가는 연산이다.
트랜잭션을 사용할 때 주의할 점
트랜잭션은 꼭 필요한 최소의 코드에만 적용하는 것이 좋다. 즉, 트랜잭션의 범위를 최소화해야 한다는 것이다.
일반적으로 DB 커넥션은 개수가 제한적이다. 각 단위 프로그램의 커넥션 소유시간이 길어진다면, 사용 가능한 여유 커넥션의 개수는 줄어들게 된다. 따라서, 어느 순간에는 각 단위 프로그램에서 커넥션을 가져가기 위해 기다려야 하는 상황이 발생할 수 있다.
또한, 복수의 트랜잭션을 사용하다보면 교착상태가 일어날 수 있다.
2개 이상의 트랜잭션이 특정 자원(테이블 or 행)의 잠금(Lock)을 획득한 채, 다른 트랜잭션이 소유하고 있는 자원을 요구하면 아무리 기다려도 상황이 바뀌지 않는 상태가 되는데, 이를 교착상태라고 한다.
교착상태의 빈도를 낮추는 방법에는 다음과 같다.
- 트랜잭션을 자주 커밋한다.
- 정해진 순서로 테이블에 접근한다.
- 읽기 잠금 획득 (select ~ for update)의 사용을 피한다.
- 한 테이블의 복수 행을 순서없이 갱신하면 교착상태가 발생하기 쉽다. 이 경우에는 테이블 단위의 잠금을 획득해 갱신을 직렬화하면 동시성은 떨어지지만 교착상태를 회피할 수 있다.
'CS > 데이터베이스' 카테고리의 다른 글
트랜잭션 격리 수준 (0) | 2023.06.26 |
---|---|
트랜잭션과 Lock (0) | 2023.06.26 |
반정규화 (0) | 2023.06.01 |
정규화 (0) | 2023.06.01 |
인덱스 (0) | 2023.05.26 |