Transaction 과 Lock
요즘 Lock timeout
으로 여러모로 애를 먹고 있기 때문에, 학부생때 이론적 지식으로만 배웠던 transaction 과 lock 에 대해 다시 한번 짚어보려고 한다.
(물론 ‘테이블 구조를 잘 .. 설계했다면’ 이란 근본적인 해결책이 있지만 ㅎㅎ)
Transaction(1)
1.1 개념
데이터베이스 트랜잭션(Database Transaction)은 데이터베이스 관리 시스템또는 유사한 시스템에서 상호작용의 단위이다. 여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미 (위키백과)
1.2 특징
트랜잭션이 성공적으로 처리되어 데이터베이스의 무결성과 일관성을 보장하기 위해선 ACID 특성을 만족해야한다.
- 원자성 (Atomicity)
모두 정상적으로 실행되거나 하나도 실행되지 않아야 한다는 all-or-nothing 방식이다.- 트랜잭션 수행 도중 장애가 발생해서 작업 완료 못하면, 모든 처리를 취소하고 이전 상태로 되돌려서 트랜잭션의 원자성을 보장해야한다.
- 일관성 (Consistency)
트랜잭션이 수행된 후에도 데이터베이스가 일관성있는 상태를 유지하는 것을 의미한다. 일관성의 경우 잘 와닿지 않아서 찾아본 예시가 있는데 이게 가장 잘 와닿았다.- 송금 금액의 데이터 타입이 정수형(integer)인데, 갑자기 문자열(string)이 되지 않는 것
-
격리성/고립성 (Isolation) 현재 수행 중인 트랜잭션이 완료될 때까지 트랜잭션이 생성한 중간 연산 결과에 다른 트랜잭션들이 접근할 수 없는 것을 의미한다.
- 지속성 (Durability) 트랜잭션이 성공적으로 완료된 후 데이터베이스에 반영한 수행 결과는 어떠한 경우에도 손실되지 않고 영구적이어야 한다는 것을 의미한다. 즉, 시스템에 장애가 발생해도 트랜잭션 작업 결과는 없어지지않고 데이터베이스에 그대로 남아있어야 한다는 의미
1.3 Commit 과 Rollback
- Commit
트랜잭션이 성공적으로 수행되었음을 의미하며, 변경된 내용을 모두 영구적으로 저장 (=데이터가 업데이트 된다.)
Commit 이 끝나면 비로서 하나의 트랜잭션 과정이 종료된다.
- auto commit: DDL(Create, Alter, Drop), DCL(Grant, Revoke)
- Rollback
작업 중 문제가 발생되면 모든 변경 사항을 취소하고, 트랜잭션 과정을 종료시킨다. 즉 하나의 묶음 처리가 시작되기 전 상태로 되돌린다.
- auto rollback: 비정상적인 종료, system failure
1.4 Django transactions
장고를 사용하기 때문에 이것저것 문서를 읽다가 몰랐거나 어렴풋이 알던 용어들 정리
- #timing-of-execution: callbacks 의 경우 커밋이 성공적으로 끝난다음에 실행되기 때문에, 만약 콜백이 실패하는 경우 롤백이 일어나지 않는다.
트랜잭션의 성공에 따라 실행되는데, 트랜잭션의 일부는 아니기 때문인데.. 그래서 Two-phase commit protocol 를 사용 할 수도 있다고 함.
- callback: 다른 코드의 인자로서 이용되는 함수 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할 수도 있음
- 1단계 커밋 프로토콜 (One-phase commit protocol): 같은 리소스들이라고 판단되는 경우 준비과정 없이 바로 커밋 -> 글로벌 트랜잭션이며, 트랜잭션 성능 향상의 한 방법
- 2단계 커밋 프로토콜 (Two-phase commit protocol): 트랜잭션 처리와 데이터베이스 컴퓨터 네트워킹 정보가 성공적으로 수정되었음을 확인하기 위해 사용하는 ACP -> 트랜잭션 성공과 실패를 확인후 이를 원자적으로 이루어 질수 있도록하는 분산 알고리즘 제공
- 지역 트랜잭션: begin -> commit , 같은 리소스 내에서 일어나는 독립적인 일들을 하나로 묵으면 로컬 트랜잭션이 됨 -> 같은 리소스를 사용하여 일을 하기 때문에 일처리가 빠름
- 글로벌 트랜잭션: 여러 리소스 사이에서 처리하는 작업 = 분산 트랜잭션 (2PC 알고리즘 기반)
-
참고
[DB이론] 트랜잭션(transaction)과 ACID 특성을 보장하는 방법 위키백과:콜백 Callback [Two-phase commit protocol][https://www.joinc.co.kr/w/man/12/TwoPhaseCommit] 1PC 1PC, 2PC 완벽하게 이해하기 좋았던 문서