Transaction(트랜젝션)

On a regular basis·2021년 7월 28일
1
post-thumbnail

🦧 트랜젝션이란?

<데이터베이스 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위>
🐤 쪼개질 수 없는 업무처리의 단위 🐤를 의미합니다.

🦧 쉬운예시! (송금과정을 하나의 트랜젝션이라고 볼 수 있음!)

예를들어! ATM으로 계좌이체를 한다고 생각해보면,
1. A 은행에서 출금하여 B은행으로 송금하려고 한다.
2. 송금 중, 알 수 없는 오류가 발생하여 A은행 계좌에서 출금은 됐지만 B은행의 계좌에 입금되지 않았다.
3. 이와 같은 상황을 막기위해 거래가 성공적으로 모두 끝나야 이를 완전한 거래로 승인하고, 거래 도중 뭔가 오류가 발생했을 때는 이 거래를 처음부터 없었던 거래로 완전히 되돌리는 것이다.
4. 내 계좌의 잔액에서 이체한 금액만큼 빼는 일과, 상대 계좌의 잔액에서 해당 금액만큼 더하는 일은 쪼개어져서는 안된다. 두가지 명령 중 하나만 실행되서는 안되며 하나의 업무로 함께 진행되어야 하는 일이기때문에!!
🐤 즉, 더이상 쪼갤 수 없기 때문에 일부만 동작해선 안된다는 것이 트랜잭션의 핵심.🐤

  • 데이터베이스에서는 테이블에서 데이터를 읽어온 후 다른 테이블에 데이터를 입력하거나 갱신, 삭제하는 데 처리 도중 오류가 발생하면 모든 작업을 원상태로 되돌린다. 데이터 베이스에선 처리 과정이 모두 성공했을 때만 최종적으로 데이터베이스에 반영함!

🦧 왜 트랜젝션 사용하지?

  • 트랜잭션은 DB 서버에 여러 개의 클라이언트가 동시에 액세스 하거나 응용프로그램이 갱신을 처리하는 과정에서 중단될 수 있는 경우 등 데이터 부정합을 방지하고자 할 때 사용함.

  • 부정합이 발생하지 않으려면 프로세스를 병렬로 처리하지 않도록 하여 한 번에 하나의 프로세스만 처리하도록 하면 되는데, 이는 효율이 너무 떨어짐.

  • 즉, 병렬로 처리할 수 밖에 없는 현실적인 상황으로 인해 부정합을 방지하고자 트랜잭션을 사용하는 것.

  • 트랜젝션을 처리하기 위해 데이터베이스에서는 다음의 세가지 명령어를 활용하는데,
    🐤 커밋(Commit): 모든 부분작업이 정상적으로 완료하면 이 변경사항을 한꺼번에 DB에 반영함.(출금->송금 완료된상태 commit!)
    🐤 롤백(Rollback): 부분 작업이 실패하면 트랜잭션 실행 전으로 되돌린다. 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스 일관성을 깨뜨렸을 때 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소하는 연산임.(출금은 됐는데 입금은 안됐을 때 처음부터 다시 송금하도록 하는 것이 rollback.)
    🐤 세이브포인트(SAVEPOINT): 모든 연산을 취소하지 않고 정해진 부분까지만 되돌리고 싶을 때 사용하는 것이 savepoint. 일반적으로 ROLLBACK을 명시하면 INSERT, DELETE, UPDATE 등의 작업 전체가 취소되지만, SAVEPOINT를 사용하면 전체가 아닌 특정 부분에서 트랜잭션을 취소시킬 수 있음.

  • 한꺼번에 수행되어야 할 연산

🦍 트랜젝션의 특징?

ACID(Atomicity, Consistency, Isolation, Durability)는 데이터베이스 트랜젝션이 안전하게 수행된다는 것을 보장하기 위한 트랜잭션의 특징을 말함. (줄여서 ACID)
🐤 원자성(Atomicity) : 트랜잭션이 DB에 모두 반영되거나, 혹은 전혀 반영되지 않아야 한다.
🐤 일관성(Consistency) : 트랜잭션의 작업 처리 결과는 항상 일관성이 있어야 한다.
ex. 계좌 A에서 계좌 B로 돈을 보낼 때, A에서 출금된 돈과 B에서 받은 돈이 같아야 된다는 뜻.
🐤 독립성(Isolation) : 각각의 트랜젝션은 서로 간섭없이 독립적으로 수행되어야 한다. 동시에 실행하는 트랜잭션으로 인한 문제를 피하기 위한 방법은 순차적으로 트랜잭션을 실행하는 것이다.
🐤 영속성(Durability) : 트랜잭션이 성공적으로 완료 되었으면 결과는 영구적으로 반영되어야 한다.

🦍 교착상태?

복수의 트랜잭션을 사용하다보면 교착상태가 일어날 수 있다. 교착상태란 두개 이상의 트랜잭션이 특정자원(테이블 or 행)의 잠금(Lock)을 획득한채 다른 트랜잭션이 소유하고 있는 잠금을 요구하면 아무리 기다려도 상황이 바뀌지 않는 상태가 되는데, 이를 교착상태라 한다.

  • 그럼 어떻게 교착상태의 빈도를 낮추지?
    🐤 트랜잭션을 자주 커밋한다.
    🐤 정해진 순서대로 테이블에 접근한다. 트랜잭션1은 A->B의 순으로 테이블에 접근하고 트랜잭션2가 B->A순으로 접근하는 것이 아니라 동일한 테이블 순으로 접근하게 한다.
    🐤 읽기 잠금 획득(SELECT ~ FOR UPDATE)의 사용을 피한다.
    🐤 한 테이블의 복수 행을 복수의 연결에서 순서없이 갱신하면 교착상태가 발생하기 쉽다.
    🐤 이 경우에는 테이블 단위의 잠금을 획득해 갱신을 직렬화 하면 동시성은 떨어지지만 교착상태를 회피할 수 있다.
profile
개발 기록

0개의 댓글