TIL - 0613

Transaction 과 Lock

요즘 Lock timeout으로 여러모로 애를 먹고 있기 때문에, 학부생때 이론적 지식으로만 배웠던 transaction 과 lock 에 대해 다시 한번 짚어보려고 한다. (물론 ‘테이블 구조를 잘 .. 설계했다면’ 이란 근본적인 해결책이 있지만 ㅎㅎ)


Transaction(1)

1.1 개념

데이터베이스 트랜잭션(Database Transaction)은 데이터베이스 관리 시스템또는 유사한 시스템에서 상호작용의 단위이다. 여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미 (위키백과)

1.2 특징

트랜잭션이 성공적으로 처리되어 데이터베이스의 무결성과 일관성을 보장하기 위해선 ACID 특성을 만족해야한다.

  1. 원자성 (Atomicity)
    모두 정상적으로 실행되거나 하나도 실행되지 않아야 한다는 all-or-nothing 방식이다.
    • 트랜잭션 수행 도중 장애가 발생해서 작업 완료 못하면, 모든 처리를 취소하고 이전 상태로 되돌려서 트랜잭션의 원자성을 보장해야한다.
  2. 일관성 (Consistency)
    트랜잭션이 수행된 후에도 데이터베이스가 일관성있는 상태를 유지하는 것을 의미한다. 일관성의 경우 잘 와닿지 않아서 찾아본 예시가 있는데 이게 가장 잘 와닿았다.
    • 송금 금액의 데이터 타입이 정수형(integer)인데, 갑자기 문자열(string)이 되지 않는 것
  3. 격리성/고립성 (Isolation) 현재 수행 중인 트랜잭션이 완료될 때까지 트랜잭션이 생성한 중간 연산 결과에 다른 트랜잭션들이 접근할 수 없는 것을 의미한다.

  4. 지속성 (Durability) 트랜잭션이 성공적으로 완료된 후 데이터베이스에 반영한 수행 결과는 어떠한 경우에도 손실되지 않고 영구적이어야 한다는 것을 의미한다. 즉, 시스템에 장애가 발생해도 트랜잭션 작업 결과는 없어지지않고 데이터베이스에 그대로 남아있어야 한다는 의미

1.3 Commit 과 Rollback

  1. Commit 트랜잭션이 성공적으로 수행되었음을 의미하며, 변경된 내용을 모두 영구적으로 저장 (=데이터가 업데이트 된다.) Commit 이 끝나면 비로서 하나의 트랜잭션 과정이 종료된다.
    • auto commit: DDL(Create, Alter, Drop), DCL(Grant, Revoke)
  2. 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 완벽하게 이해하기 좋았던 문서