ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 트랜잭션 제대로 이해하기
    IT-Information/Blockchain 2021. 12. 9. 16:10

    랜잭션이란 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위를 뜻합니다. 데이터베이스의 상태를 변화시킨다는 것은 질의어(SQL)를 이용하여 데이터베이스를 접근하는 것을 의미합니다.

    하나의 작업을 수행하기 위해 필요한 데이터베이스의 연산을 모아놓은 것으로 표현하기도 합니다. 데이터베이스에 논리적인 작업의 단위로 장애가 발생했을 때 데이터를 복구하는 작업의 단위입니다.

     

    ▷질의어(SQL)

    [Blockchain/용어] - 질의어

    ▷데이터베이스

    [Blockchain/용어] - 데이터베이스


    예시

    를 통해 알아보겠습니다.

    부산의 고향을 떠나 서울에서 일하고 있는 A씨는 매달 고향에 계신 부모님께 생활비를 보내고 있다. 그래서 월급날이 되자 A씨는 월급 통장에서 부모님의 통장으로 돈을 송급합니다. 이 때 은행측에서 볼 때는 출금과 입금이 각각 1번씩 발생하게 됩니다. 그런데 부모님 통장으로 돈을 입금하는 순간에 네트워크 장애로 인해 통장에 돈이 입금되지 않은 상황이 발생합니다. A씨의 통장에는 돈이 출금되었지만 부모님의 통장에는 입금되지 않은 것입니다. 은행에서는 어떻게 처리할 까요.

    출금과 입금이 1번씩 발생하지만 은행에서는 송금 자체를 하나의 트랜잭션(거래)로 보고 A씨의 통장에서 출금한 돈이 부모님 통장에 정확히 입금이 확인되면 그 때 거래를 성사시팁니다. commit을 발생시키는 것입니다.

    따라서 위의 경우처럼 네트워크 장애로 인해 출금만 발생하고 입금이 되지 않을 경우에는 이를 모두 취소rollback하게 됩니다. 이렇게 처리하면 A씨의 돈이 사라지지 않고 다시 송금을 할 수 있게됩니다. A씨는 첫번째 송금 시 은행 전산장애로 인해 거래가 성립되지 않았습니다라는 문구를 보았을 것입니다.

     

    즉, 데이터베이스에서도 트랜잭션의 의미는 위의 경우와 같습니다. 다른 점은 개발자는 명시적으로 commit이나 rollback을 선언해 주어야 한다는 점이조. 하나의 트랜잭션이 어디서부터 어디까지인지를 선언해줘야 합니다.


    트랜잭션에 있어 작업의 단위는 질의어 한문장이 아닙니다. 작업단위는 많은 질의어 명령문들을 사람이 정하는 기준에 따라 정하는 것을 의미합니다. 게시판을 예로 들자면

    게시판 사용자는 게시글을 작성하고, 올리기 버튼을 누른다. 그 후 다시 게시판에 돌아왔을때 자신의 글이 포함된 업데이트된 게시판을 본다. 이런 상황을 데이터베이스 작업으로 옮기면, 사용자가 올리기 버튼을 눌렀을 때 Insert문을 사용하여 사용자가 입력한 게시글의 데이터를 옮긴다. 그 후 게시판을 구성할 데이터를 다시 select하여 최신 정보로 유지한다. 여기서 작업의 단위는 insert문과 select문 둘을 합친것입니다.

     

    트랜잭션의 특징

    ▷원자성

    트랜잭션이 데이터베이스에 모두 반영되던가 아니면 전혀 반영되지 않는 것 all-or-nothing 방식

    트랜잭션을 수행하다가 장애가 발생하여 작업을 완료하지 못했다면, 지금까지 실행한 연산들 모두 취소하고 데이터베이스를 트랜잭션 작업 전의 상태로 되돌려 트랜잭션의 원자성을 보장합니다. 이처럼 원자성을 보장하려면 장애가 발생했을 때 데이터베이스의 원래 상태로 복구하는 회복 기능이 필요합니다.

    ▷일관성

    트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것

    트랜잭션이 진행되는 동안에 데이터가 변경 되더라도 업데이트된 데이터로 트랜잭션이 진행되는 것이 아니라 처음에 참조한 데이터로 진행된다. 이렇게 하여 사용자는 일관성 있는 데이터를 본다.

    즉, 트랜잭션이 수행되기 전에 데이터베이스가 일관된 상태였다면 트랜잭션의 수행이 완료된 후 결과를 반영한 데이터베이스도 또 다른 일관된 상태가 되어야 합니다.

    ▷독립성, 격리성

    어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다, 특정 트랜잭션이 완료될 때 까지 다른 트랜잭션이 특정 결과를 참조할 수 없습니다.

    시스템에 여러 트랜잭션이 동시에 수행되지만 각 트랜잭션이 독립적으로 수행될 수 있도록 다른 트랜잭션의 중간 연산 결과에 서로 접근하지 못하게 합니다.

    이를 통해 사용자들은 트랜잭션이 동시에 수해되는 거처럼 느끼면서 결과는 순서대로 얻게되는 것입니다.

    ▷지속성

    트랜잭션이 완료되면 결과는 영구적으로 반영되어야 합니다.

    수행 결과는 어떠한 경우에도 손실되지 않고 시스템에 장애가 발생하더라도 트랜잭션 작업 결과는 없어지지 않고 데이터베이스에 그대로 남아 있어 지속성을 만들어냅니다. 지속성을 보장하기 위해서는 데이터베이스 상태 복구 회복 기능이 필요하게 됩니다.

     

    연산 Commit, Rollback

    보통 DB를 사용할 때 쿼리를 날리면 데이터베이스에 반영이된다 생각합니다. DB에 반영되는 시점은 트랜잭션 연산이 성공적으로 완료되는 시점에 실제 데이터베이스에 반영이 됩니다. 그리고 트랜잭션 연산에는 크게 두가지 과정이 있습니다.

    ▷commit 하나의 트랜잭션이 성공하여 끝났고 데이터베이스가 일관성 있는 상태를 지속적으로 유지시키기 위해 하나의 트랜잭션이 끝났다라는 것을 알리는 사용 연산이다. 이 연산을 사용하면 수행했던 트랜잭션이 로그에 저장되며, 후에 Rollback 연산을 수행했었던 트랜잭션단위로 하는 것을 도와준다.

    이 연산 실행을 통해 트랜잭션 수행이 성공적으로 완료되었음을 선언하고 결과를 최종 DB에 반영한다.

     

    ▷Rollback 하나의 트랜잭션 처리가 비정상 종료로 원자성이 깨진경우, 트랜잭션을 처음부터 다시 시작하거나 부분적으로 취소시킨다. 트랜잭션 처리 단위대로 rollback 진행도 할 수 있다.

    트랜잭션 수행 도중 오류로 인한 상황에서 DB의 일관성 유지를 위해 선언하고 되돌린다.

     

    트랜잭션의 상태

    ▷활동상태

      트랜잭션이 수행을 시작하여 진행중

    ▷부분 완료 상태

      마지막 연산이 실행된 후 상태 부분 완료

      연산은 모두 처리한 상태이지만 수행한 최종 결과를 DB에 아직 반영하지 않은 상태

    ▷완료 상태

      트랜잭션이 성공적으로 완료되어 commit 연산을 실핸한 완료 상태

    ▷실패 상태

      장애가 발생하여 트랜잭션 수행이 중단된 상태

    ▷철회 상태

      수행이 실패하여 rollback연산 실행 상태

     

    마무리

    트랜잭션의 행위는 commit, rollback으로 이루어진다고 볼 수 있습니다. 트랜잭션의 모든 명령문이 완벽하게 처리되거나 하나도 처리되지 않아야 데이터베이스 모순이 없는 일관된 상태를 유지합니다. 트랜잭션은 데이터베이스에 장애가 발생했을 때 복구 작업을 수행하거나 다수 사용자가 동시에 사용할 수 있도록 제어 작업을 하는 데 중요한 단위로 사용됩니다. 그러므로 데이터베이스의 무결성과 일관성을 보장하려면 작업을 수행하는데 필요한 연산들을 하나의 트랜잭션으로 제대로 정의하고 관리해야 합니다.

     

    'IT-Information > Blockchain' 카테고리의 다른 글

    폴리곤 MATIC (22.5.4 공시)  (0) 2022.05.05
    korbit 거래소 활용하기  (0) 2022.05.05
    폴리곤  (0) 2022.04.02
    Hashgraph 란  (0) 2022.02.13
    기존의 디지털 통화  (0) 2022.02.09
    디지털 경제의 화폐  (0) 2022.02.09
    연준, 중앙은행 디지털통화(CBDC) 보고서 주요 내용  (0) 2022.01.21
    스테이블코인 해외 논의 동향 22.1.7  (0) 2022.01.17
Designed by Tistory.