[Database] Transaction

Dabi·2022년 3월 29일
6

데이터베이스

목록 보기
4/10


이번 포스팅은 데이터베이스의 트랜잭션에 대한 내용을 담고 있습니다.



[Intro]



다들 호캉스나 여행을 위해 호텔을 예약해본 경험이 있으신가요?

만일 예약일에 해당 호텔을 방문 했더니 나와 같은 방을

예약한 손님이 나 말고도 3명이나 더 있다면 어떡해야 할까요?



좀 더 시간을 돌려 호텔 매니저가 예약일 하루 전에 이 사실을 알았더라면 어떻게 했을까요?

아마 저라면 가장 먼저 예약장부를 뒤져 예약한 손님들의 연락처 정보를 먼저 찾을겁니다.

빨리 다른 방으로 변경해드리거나, 과실로 인한 추가 서비스를 제안드려야 할테니까요.

그런데 만일 예약을 받을때 손님들회신가능한 번호들을 적어놓지 않았다면 어떻게 될까요?

생각만해도 아찔한 상황입니다😨



이러한 상황은 데이터베이스에서도 마찬가지입니다. 예약을 하고, 취소를 하는 등의 하나의

사건 단위를 데이터베이스에서는 트랜잭션이라고 부릅니다.

트랜잭션이 어떤 개념이고 무엇이 중요한지 한번 알아보도록 하겠습니다.



[Definition]

트랜잭션(Transaction) :

데이터베이스의 상태를 변화시키기 위해 수행하는 논리적인 작업의 단위

❓ "데이터베이스의 상태를 변화시킨다는 것"

  • 쿼리문 (ex/ SQL-> SELECT, INSERT, DELETE, UPDATE)을 이용하여 데이터베이스에
    접근하는 것을 의미합니다.

❓❓ "작업 단위"

  • 쿼리문들을 정해진 기준에 따라 나누어놓은 것

✔ 따라서 데이터베이스의 연산을 SQL문으로 표현한다면,

하나의 작업을 수행하는 SQL문의 집합으로 생각할 수도 있습니다.


❓❓❓ Example

💰 1. 은행 시스템

A계좌에서 B계좌로 송금을 하는것은, 각각 계좌에 INSERT/DELETE 혹은 UPDATE

쿼리문이 수행되는 것을 의미하며, 두번의 쿼리문이 하나의 사건이므로 한단위 두 쿼리가 하나의

트랜잭션이라 할 수 있습니다.

📰 2. 인터넷 게시판

- 글을 작성하고 나서 완료 버튼을 누르면 글이 게시 

- 재고가 있는 물건에 대하여 장바구니에 담기

- 주문한 물건에 대하여 주문 취소 신청

위와 같은 작업 또한 서버내의 데이터베이스의 상태가 변하기 때문에 하나의 트랜잭션입니다.


[Properties]


트랜잭션을 먹어 본 제 주변 지인들의 말에 의하면 트랜잭션은 엄청 신맛이라고 합니다.
왜냐면 트랜잭션은 산성(ACID)을 지니기 때문이죠..트랜잭 셔!!...죄송합니다...

하나의 트랜잭션이 안전하게 그 기능을 보장받기 위해서는

ACID라는 트랜잭션의 성질을 다 충족시켜 주어야 합니다.

트랜잭션의 성질에 대해 하나씩 알아보겠습니다.

[Atomicity_원자성]


🔴 트랜잭션을 구성하는 연산은 반드시 모두 실행이 되거나, 혹은 아예 실행되지 않아야 함 🔴


목욕탕에서 냉탕과 온탕 중 하나만 들어갈 수 있는 것과 같습니다.

미지근한 그 어딘가는 있어서는 안되는 것이죠.

다시말해, 하나의 트랜잭션에서 일부 연산만 실행되면 안되고,

일부만 실행될 수 없어야 합니다.


[Consistency_일관성]


🟡트랜잭션이 완료된 상태에서, 트랜잭션 이전의 상황과 동일하게 데이터의 일관성이 존재 🟡


데이터에 모순이 있어서는 안 되는 것이죠. 앞서 말한 은행 송금 사례를 생각해보면,

트랜잭션 수행 이전의 송금자와 수금자의 잔액 합이 수행 후에 달라지거나,

혹은 잔액을 나타내는 자료형이 정수형에서 문자열로 바뀌는 등의 모순이 발생해서는 안됩니다.


[Isolation_격리성/독립성]


🟢트랜잭션은 다른 트랜잭션에 간섭을 주거나 받지 않고 독립적으로 수행 🟢


둘 이상의 트랜잭션이 병행 실행되는 경우, 현재 수행 중인 트랜잭션이 완료되기 전에

현재 트랜잭션이 생성한 중간 연산 결과를 다른 트랜잭션이 접근하면 안 됩니다.

독립성을 통해서, 사용자들은 여러 트랜잭션이 동시에 수행되고 있는 것처럼

느끼면서도 무결성이 깨지지 않고, 정확한 결과를 얻을 수 있게 됩니다.


[Durability_지속성]


🔵 트랜잭션이 성공적으로 완료되었을 때 그 결과는 영구적으로 반영 🔵

시스템의 장애가 발생하더라도 결과는 데이터베이스에 그대로 남아있어야 하며, 지속성을 보장하기 위해서 회복 기능이 필요합니다.



✅트랜잭션은 원격으로 데이터베이스라는 일지를 수정하도록 요청하는 것입니다.



[Computation_연산]


보통 DB를 사용할때, query를 날리면 데이터베이스에 반영이 된다고 생각하지만,

DB에 반영되는 시점은 트랜잭션 연산이 성공적으로 완료되는 시점에 실제 데이터 베이스에

반영이 됩니다. 이러한 트랜잭션 연산에는 크게 두가지가 있습니다.

[commit]

  • 트랜잭션이 성공적으로 수행되었음을 선언(작업 완료)
  • commit 연산이 실행된 후에야 트랜잭션의 수행 결과가 데이터베이스에 반영되어
    데이터베이스가 일관된 상태를 지속적으로 유지
  • commit 연산의 실행을 통해 트랜잭션의 수행이 성공적으로 완료 되었음을 선언하고,
    결과를 최종 데이터베이스에 반영.

[rollback]

  • 트랜잭션이 수행을 실패했음을 선언(작업 취소)
  • rollback 연산이 실행되면 트랜잭션이 지금까지 수행한 연산의 결과가 취소되고,
    트랜잭션이 수행되기 이전의 상태로 돌아갑니다.
  • 트랜잭션이 수행되는 중, 일부 연산이 처리되지 못한 상황에서는 rollback 연산을 실행하여,
    트랜잭션의 수행이 실패했음을 선언하고, 모순되지 않도록 데이터베이스를 트랜잭션 수행 전의
    상태로 되돌려 놓습니다.

[savePoint]

  • savePoint는 트랜잭션 내부에서 사용자가 지정할 수 있는 세부 작업 단위 입니다.

    아래의 그림처럼 특정 지점에 savePoint를 설정 한 후 'Rollback to savePoint1' 을
    통해 해당 지점으로 롤백을 할 수 있습니다.

    여기서 기억해야할 점은 아래 그림에서 SP1으로 롤백을 한 뒤에는 미래 시점인
    SP2의 savePoint는 삭제 된다는 것입니다.

[Conditions]

트랜잭션의 상태는 총 5가지가 존재합니다.

  • 활동(Active) : 트랜잭션이 실행 중인 상태

  • 실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태

  • 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태

  • 부분완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만,
    Commit 연산이 실행되기 직전의 상태

  • 완료(Committed) : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태



[Conclusion]


이번 포스팅에서는 데이터베이스에서 트랜잭션이 수행될때 어떻게 일관성과 지속성을

유지하는지에 대하여 알아 보았습니다.

다음 포스팅에서는 이러한 트랜잭션의 격리수준에 대해 포스팅하도록 하겠습니다.

참고

https://brunch.co.kr/@skeks463/27#comment

profile
논리적인 사고와 추론을 지향합니다.

4개의 댓글

comment-user-thumbnail
2022년 3월 29일

tcp socket 통신을 기반으로 db server에 접속하여 트랜잭션이 일어나는 건가요?

답글 달기
comment-user-thumbnail
2022년 3월 29일

트랜잭션에 대해 깔끔하게 정리된 포스팅이네요! 좋은 글 감사합니다!

답글 달기
comment-user-thumbnail
2022년 3월 29일

트랜잭션에 대하여 쉽게 이해할 수 있었습니다! 중간에 아이셔 (ACID)로 피식 포인트도 만들어주셔서 재미있게 읽을 수 있었네요. 유익한 포스팅 감사합니다!

답글 달기
comment-user-thumbnail
2022년 3월 30일

글이 정말 잘 읽힙니다! 트랜잭 셔.. 에서 피식해버렸네요

답글 달기