트랜잭션(Transaction)
정의
- 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위
- 한번에 모두 수행되어야 할 일련의 연산들을 의미
이해
- 트랜잭션은 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적 단위이다.
- 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업단위이다.
- 하나의 트랜잭션은 Commit되거나 Rollback된다.
특징
- 원자성 (Atomicity)
- 트랜잭션이 데이터베이스에 모두 반영 또는 전혀 반영되지 않아야 함
- 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 함
- 일관성 (Consistency)
- 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환
- 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야 함
- 독립성 (Isolation)
- 둘 이상의 트랜잭션이 실행될 경우, 다른 트랜잭션에 영향을 줄 수 없음
- 수행중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조
- 지속성 (Durability)
- 트랜잭션이 성공적으로 끝났을 경우, 결과가 영구적으로 반영됨
Commit / Rollback
Commit
- 하나의 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관성있는 상태에 있을 때, 하나의 트랜잭션이 끝났다라는 것을 트랜잭션 관리자에게 알려주기 위하여 사용하는 연산
- 연산을 사용하면 수행했던 트랜잭션이 로그에 저장
Rollback
- 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진경우, 트랜잭션을 처음부터 다시 시작하거나, 트랜잭션의 부분적으로만 연산된 결과를 다시 취소
- 활동(Active) : 트랜잭션이 실행중인 상태
- 실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태
- 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
- 부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전의 상태
- 완료(Committed) : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태
Lock 해결방법
Lock
- Lock이란 트랜잭션 처리의 순차성을 보장하기 위한 방법
- DBMS마다 Lock을 구현하는 방식과 세부적인 방법이 다름
- DBMS를 효과적으로 이용하기 위해서는 해당 DB의 Lock에 대한 이해가 필요
Lock 종류
- Lock의 종류로는 공유(Shared) Lock과 베타(Exclusive) Lock이 있음
- 공유락은 다른 말로 Read Lock이라고 불리며 베타락은 Write Lock이라고도 불림
공유(Shared) Lock
- 공유 Lock은 데이터를 읽을 때 사용되어지는 Lock
- 공유 Lock은 공유 Lock 끼리는 동시에 접근이 가능
- 하나의 데이터를 읽는 것은 여러 사용자가 동시에 할 수 있다라는 의미
- 공유 Lock이 설정된 데이터에 베타 Lock을 사용할 수는 없음
베타(Exclusive) Lock
- 베타 Lock은 데이터를 변경하고자 할 때 사용되며, 트랜잭션이 완료될 때까지 유지
- 베타락은 Lock이 해제될 때까지 다른 트랜잭션(읽기 포함)은 해당 리소스에 접근할 수 없음
- 베타 Lock은 다른 트랜잭션이 수행되고 있는 데이터에 대해서는 접근하여 함께 Lock을 설정할 수 없음
Lock 설정 범위
- 데이터베이스
- 데이터베이스 범위의 lock은 전체 데이터베이스를 기준으로 lock
- 1개의 세션만이 DB의 데이터에 접근이 가능
- 일반적으로는 사용하지 않음. DB의 소프트웨어 버전을 올린다던지 주요한 DB의 업데이트에 사용
- 파일
- 데이터베이스 파일을 기준으로 lock을 설정
- 테이블, row 등과 같은 실제 데이터가 쓰여지는 물리적인 저장소
- 파일 범위의 Lock은 잘 사용되지는 않음
- 테이블
- 테이블 수준의 Lock은 테이블을 기준으로 Lock을 설정
- 테이블의 모든 행을 업데이트 하는 전체 테이블에 영향을 주는 변경을 수행할 때 유용
- DDL(create, alter, drop 등) 구문과 함께 사용되며 DDL Lock이라고도 불림.
- 페이지와 블럭
- 파일의 일부인 페이지와 블록을 기준으로 Lock을 설정
- 잘 사용되지는 않음
- 컬럼
- 컬럼 기준의 Lock은 컬럼을 기준으로 Lock을 설정할 수 있음
- 해당 형식은 Lock 설정 및 해제의 리소스가 많이 들기 때문에 일반적으로 사용되지는 않음
- 지원하는 DBMS도 많지 않음
- 행(Row)
- 행 수준의 Lock은 1개의 행(Row)를 기준으로 Lock 설정
- DML에 대한 Lock으로 가장 일반적으로 사용하는 Lock
블로킹(Blocking)
- 블로킹은 Lock간(베타 - 베타, 베타 - 공유)의 경합이 발생하여 특정 Transaction이 작업을 진행하지 못하고 멈춰선 상태
- 공유락 끼리는 블로킹이 발생하지 않지만 베타락은 블로킹을 발생
- 블로킹을 해소하기 위해서는 이전의 트랜잭션이 완료(커밋 OR 롤백)가 필요
- 나중에 들어온 트랜잭션은 이전 트랜잭션이 마무리되어야 이후 진행이 가능
- 경합은 성능에 좋지 않은 영향을 미치기 때문에, 경합을 최소화 할 필요가 있음
- 한 트랜잭션의 길이를 너무 길게하는 것은 경합의 확률이 높아짐
- 설계 시 같은 데이터를 갱신하는 트랜잭션이 동시에 수행되지 않도록 해야함
- 트랜잭션 격리성 수준을 불필요하게 상향 조정하지 않음
- 쿼리를 오랜시간 잡아두지 않도록 적절한 튜닝을 진행 필요
교착상태(Deadlock)
- 교착상태는 두 트랜잭션이 각각 Lock을 설정하고 다음 서로의 Lock에 접근하여 값을 얻어오려고 할 때
- 각각의 트랜잭션에 의해 Lock이 설정되어 있기 때문에 양쪽 트랜잭션 모두 영원히 처리가 되지않게 되는 상태
- 교착상태가 발생하면 DBMS가 둘 중 한 트랜잭션에 에러를 발생시킴으로써 문제를 해결
- 교착상태가 발생할 가능성을 줄이기 위해서는 접근 순서를 동일하게 하는것이 중요
출처