검수요청.png검수요청.png

"트랜잭션"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
잔글
 
(사용자 8명의 중간 판 46개는 보이지 않습니다)
1번째 줄: 1번째 줄:
[[파일:로커스체인 로고.png|썸네일|200픽셀|'''로커스체인'''(Locus Chain)]]
+
'''트랜잭션'''(transaction)이란 "쪼갤 수 없는 업무 처리의 최소 단위"를 말한다. '''거래내역'''이라고도 한다. '트렌젝션'이 아니라 '트랜잭션'이 올바른 표기법이다. 영어로 간략히 '''Tx'''라고 표기하기도 한다. 1초당 처리할 수 있는 트랜잭션의 개수를 [[TPS]]라고 한다.
[[파일:로커스체인 글자.png|썸네일|300픽셀|'''로커스체인'''(Locus Chain)]]
 
  
[[파일:블룸테크놀로지 글자.png|썸네일|300픽셀|'''[[블룸테크놀로지]]'''(Bloom Technology)]]
+
== 개요 ==
[[파일:이상윤.jpg|썸네일|200픽셀|'''[[이상윤]]''' 대표이사]]
+
트랜잭션은 은행 [[ATM]]이나 [[데이터베이스]] 등의 시스템에서 사용되는 더 이상 쪼갤 수 없는 업무 처리의 최소 단위이다. 예를 들어, A라는 사람이 B라는 사람에게 1,000원을 지급하고 B가 그 돈을 받은 경우, 이 거래 기록은 더 이상 작게 쪼갤 수가 없는 하나의 트랜잭션을 구성한다. 만약 A는 돈을 지불했으나 B는 돈을 받지 못했다면 그 거래는 성립되지 않는다. 이처럼 A가 돈을 지불하는 행위와 B가 돈을 받는 행위는 별개로 분리될 수 없으며 하나의 거래내역으로 처리되어야 하는 단일 거래이다. 이런 거래의 최소 단위를 트랜잭션이라고 한다. 트랜잭션 처리가 정상적으로 완료된 경우 [[커밋]](commit)을 하고, 오류가 발생할 경우 원래 상태대로 [[롤백]](rollback)을 한다.
[[파일:김세정.jpg|썸네일|200픽셀|'''[[김세정]]''' 공동창업자]]
 
  
'''로커스체인'''<!--로커스 체인|로커스체인|Locus Chain-->(Locus Chain)은 PC 및 휴대폰 등 널리 보급된 일반적인 디바이스로 구성된 블록체인 네트워크 상에서 초당 수천 트랜잭션을 처리하는 성능을 목표로 개발 중인 블록체인 플랫폼을 위한 [[암호화폐]]이다. 로커스체인의 슬로건은 "실제 사용을 위한 암호화폐"이다. 로커스체인의 창시자는 [[블룸테크놀로지]] 회사의 '''[[이상윤]]'''이다.
+
== 목적 ==
 +
트랜잭션은 데이터베이스 서버에 여러 개의 클라이언트가 동시에 액세스 하거나 응용프로그램이 갱신을 처리하는 과정에서 중단될 수 있는 경우 등 데이터 부정합을 방지하고자 할 때 사용한다.<ref name="트랜잭션 성질2"/> 데이터베이스 기능 중, 트랜잭션을 조작하는 기능은 데이터베이스 완전성(integrity) 유지를 확신하게 한다. 단일 트랜잭션은 데이터베이스 내에 읽거나 쓰는 여러 개 쿼리를 요구한다. 이때 중요한 것은 데이터베이스가 수행된 일부 쿼리가 남지 않는 것이다. 예를 들어, 송금을 할 때 한 계좌에서 인출되면 다른 계좌에서 입금이 확인되는 것이 중요하다. 또한 트랜잭션은 서로 간섭하지 않아야 한다. 만약 쿼리 하나가 실패하면, 데이터베이스 시스템은 전체 트랜잭션 또는 실패한 쿼리를 롤백 한다. 이것은 DBMS가 어떻게 사용되고 셋업 되었느냐에 따라 다르다. 트랜잭션은 커밋전에 언제든지 수동으로 롤백 될 수 있다. 간단한 트랜잭션의 경우 아래 양식의 SQL 언어로 데이터베이스 내에서 실행된다.<ref>데이터베이스 트랜잭션 위키백과 - https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98</ref>
 +
* Begin the transaction<ref>〈[https://docs.microsoft.com/ko-kr/sql/t-sql/language-elements/begin-transaction-transact-sql?view=sql-server-ver15 BEGIN TRANSACTION(Transact-SQL)]〉, 《마이크로소프트》, 2016-06-10</ref>
 +
--Applies to SQL Server and Azure SQL Database
 +
 +
BEGIN { TRAN | TRANSACTION } 
 +
    [ { transaction_name | @tran_name_variable } 
 +
      [ WITH MARK [ 'description' ] ]
 +
    ]
 +
[ ; ]  
  
위 목표를 달성하기 위한 중요한 기술적인 문제점은 [[네트워크]] 전송량과 [[트랜잭션]] 계산량이다. 로커스체인에서는 네트워크 전송량과 계산량을 줄이는 방법으로서 [[샤딩]]을 통한 서브네트워크 구성 및 분산처리를 채택하고 있다. [[샤드]] 내 [[합의 알고리즘]][[비잔틴 장애 허용]](BFT) 계열을 응용하여 트랜잭션 확정까지의 시간을 단축한다. 원장 구조는 [[방향성 비순환 그래프]](DAG) 계열 데이터 구조를 채택하여 리얼타임 동적 샤딩 및 [[프루닝]]을 구현하고 있다.
+
--Applies to Azure SQL Data Warehouse and Parallel Data Warehouse
 +
 +
BEGIN { TRAN | TRANSACTION } 
 +
[ ; ]  
 +
* Execute several queries(DB내 갱신이 아직 적용되지 않는다.)
 +
* Commit the transaction(트랜잭션이 성공적이며, 갱신이 실제 적용됨.)<ref>〈[https://docs.microsoft.com/ko-kr/sql/t-sql/language-elements/commit-transaction-transact-sql?view=sql-server-ver15 COMMIT TRANSACTION(Transact-SQL)]〉, 2016-09-09</ref>
 +
-- Applies to SQL Server (starting with 2008) and Azure SQL Database
 +
 
 +
COMMIT [ { TRAN | TRANSACTION }  [ transaction_name | @tran_name_variable ] ] [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
 +
[ ; ]
  
로커스체인은 이더리움 기반의 [[ERC-20]] 토큰인 [[로커스]](LOCUS)를 발행했으며 글로벌 암호화폐 거래소인 [[비트레이드]], [[라토큰]]에 상장되었고 추후 메인넷이 발표되면 로커스 코인으로 [[아토믹스왑]](atomic swap)을 지원할 예정이다.
+
-- Applies to Azure SQL Data Warehouse and Parallel Data Warehouse Database
 +
 
 +
COMMIT [ TRAN | TRANSACTION ]  
 +
  [ ; ]
  
== 개요 ==  
+
== 조건 ==
'''로커스체인'''(Locus Chain)은 '''탈중앙화'''에 충실하면서 동시에 '''성능''' 및 '''확장성'''문제를 해결하려 한다. 먼저 로커스체인은 탈중앙화의 중요한 요소로서 누구나 쉽고 공정하게 참여할 수 있어야 한다는 점을 중시한다. 이를 위해 현재의 일반적인 PC와 휴대폰 및 IoT디바이스의 네트워크 성능, 저장 공간, CPU속도 및 계산량의 한계를 이해하고, 이 위에서 무리 없이 동작하는 알고리즘과 데이터 구조를 개발하여 이를 로커스체인 전체 시스템으로서 구현해 나가는 방향으로 연구가 진행되고 있다.
+
트랜잭션은 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적인 단위로 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업 단위이다. 하나의 트랜잭션은 커밋(commit) 되거나 롤백이 된다.<ref name="트랜잭션">코딩팩토리, 〈[https://coding-factory.tistory.com/226 (DB기초) 트랜잭션이란 무엇인가?]〉, 《티스토리》, 2018-08-20</ref> [[데이터베이스]]트랜잭션이 안전하게 수행되기 위해서는 ACID 조건을 충족해야 한다. ACID란 Atomicity(원자성), Consistency(일관성), Isolation(고립성), Durability(지속성)의 약자로서, 데이터베이스의 트랜잭션이 안전하게 수행되기 위한 4가지 필수적인 성질을 말한다.  
  
먼저, 원장 구조로서 처리 성능을 담보하기 어려운 선형구조 대신 비선형구조인 '''DAG(Directed Acyclic Graph)'''를 채용하였다. 로커스체인의 '''AWTC(Account-wise Transaction Chain)'''구조는 어카운트/유저를 중심으로 트랜잭션 그래프를 구성하여 각 트랜잭션을 관리하는 DAG구조이다. 각 트랜잭션의 전후 관계와 다른 트랜잭션들과의 관계가 그래프상에 직접 배치됨으로 고속 참조가 가능하면서도, 어카운트 단위로 정보를 총합 관리함으로써 샤드간 이동과 통합을 가능하게 하는 데이터 구조이다.
+
=== 원자성 ===
 +
원자성(atomicity)은 하나의 트랜잭션이 더 이상 작게 쪼갤 수 없는 최소한의 업무 단위이다. 트랜잭션이 데이터베이스에 모두 반영되던지, 아니면 전혀 반영되지 않아야 하며 작업이 부분적으로 실행되거나 중단되지 않는 것을 보장하는 것으로 즉, All or Nothing의 개념으로서 작업 단위를 일부분만 실행하지 않는다는 것을 의미한다. 트랜잭션 실행 도중 문제가 발생했을 경우 중단된 상태가 아닌 모두 실패하거나, 모두 완성되거나 둘 중 하나의 상태가 되어야 한다. 즉, 100개 명령어로 구성된 트랜잭션 중 99개 완료 1개 실패가 된다면, 이는 무조건 실패로 간주하여 트랜잭션 시작 전 상태로 돌려야 한다. 또한 100개가 모두 성공했을 시 트랜잭션은 성공이기 때문에 중간 상태가 없다. 트랜잭션은 사람이 설계한 논리적인 작업 단위이기 때문에 일처리가 작업 단위 별로 이루어져야 사람이 다루는데 무리가 없다. 만약 트랜잭션 단위로 데이터가 처리되지 않는다면, 설계한 사람은 데이터 처리 시스템을 이해하기 힘들 뿐만 아니라, 오작동 했을 시 원인을 찾기가 매우 힘들어진다. 트랜잭션 내의 모든 명령은 반드시 완벽하게 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느 하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다. 트랜잭션이 원자성이라는 성질을 지니게 된 이유는 중간에 끊기게 되면 이후 해당 트랜잭션의 어디서부터 이어서 수행되어야 하는지 모르기 때문이다.<ref name="트랜잭션 성질2">victolee, 〈[https://victorydntmd.tistory.com/129 (DB이론) 트랜잭션(transaction)과 ACID 특성을 보장하는 방법]〉, 《티스토리》, 2018-02-09</ref><ref name="트랜잭션"/><ref name="트랜잭션 성질">Mommoo,
 +
〈[https://mommoo.tistory.com/62 트랜잭션(Transaction)이란?]〉, 《티스토리》, 2017-02-27</ref><ref name="트랜잭션 성질3">Lim-Ky, 〈[https://limkydev.tistory.com/100 (DataBase) 트랜잭션이란? (Transaction)]〉, 《티스토리》, 2017-10-06</ref><ref name="트랜잭션 성질4">망나니 개발자, 〈[https://mangkyu.tistory.com/30 (Database) 8. 트랜잭션, 동시성 제어, 회복]〉, 《티스토리》, 2017-12-12</ref>
  
다음, 로커스체인의 합의 알고리즘은 PoS(Proof-of-Stake)를 기반으로 하는 '''BFT합의'''를 채택하고 있다. PoW(Proof-of-Work)와  Nakamoto합의가 가지는 비효율적인 CPU계산량 소모와 불확정성을 피하기 위한 목적이다. BFT합의의 고속화를 위해, 로커스체인은 전체 네트워크 노드 중 합의에 참여하는 노드를 공정한 방법으로 랜덤하게 샘플링하는 방식을 채택하고 있다. 이 랜덤 선출에는 각 노드의 로커스체인 네트워크에 대한 여러 가지 기여도가 반영된다. PoS를 통해 코인의 지분 소유량이 반영될 있고, 노드의 온라인 시간 등 코인량 이외의 내용도 반영이 가능하다.
+
* '''원자성 보장''' : 트랜잭션에서 원자성은 수행하고 있는 트랜잭션에 의해 변경된 내역을 유지하면서, 이전에 커밋된 상태를 임시 영역에 따로 저장함으로써 보장한다. 즉, 현재 수행하고 있는 트랜잭션에서 오류가 발생하면 현재 내역을 날려버리고 임시 영역에 저장했던 상태로 롤백 한다. 이전 데이터들이 임시로 저장되는 영역을 롤백 세그먼트(rollback segment)라고 하며, 현재 수행하고 있는 트랜잭션에 의해 새롭게 변경되는 내역을 데이터베이스 테이블이라고 한다. 다시 말해, 트랜잭션의 원자성은 롤백 세그먼트에 의해 보장된다고 할 수 있다. 그런데 오류가 발생하면 롤백 하는데, 트랜잭션의 길이가 길어지게 되면 확실하게 오류가 발생하지 않는 부분도 다시 처음부터 작업을 수행해야 한다. 따라서 확실한 부분에 대해서는 롤백이 되지 않도록 중간 저장 지점인 세이브포인트(save point)를 지정할 있다. 세이브포인트를 지정하게 되면 롤백 할 때 세이브포인트 이전은 확실하다 간주하고 그 이후부터 진행하게 된다.<ref name="트랜잭션 성질2"/>
  
그리고, 네트워크 부하를 줄이기 위한 목적으로 '''다이내믹 샤딩(Dynamic Sharding)'''이 도입되어 있다. 각 샤드는 독립적으로 BFT합의 알고리즘을 수행하며, 하나의 어카운트는 한번에 단 하나의 샤드에서만 처리된다. 따라서 로커스체인에서는 노드 숫자가 늘어나면 이에 비례하여 트랜잭션 처리량이 늘어난다.
+
=== 일관성 ===
 +
일관성(consistency)은 트랜잭션이 완료된 결괏값이 일관적인 DB 상태를 유지하는 것을 말한다. 시스템이 가지고 있는 고정요소는 수행 전과 후의 상태가 같아야 하며 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것으로 트랜잭션이 진행되는 동안 데이터베이스가 변경되더라도 업데이트된 데이터베이스로 트랜잭션이 진행되는 것이 아니라, 처음 트랜잭션을 진행하기 위해 참조한 데이터베이스로 진행된다. 이렇게 함으로써 사용자가 일관성 있는 데이터를 볼 수 있는 것이다. 트랜잭션 수행 전후의 데이터베이스 상태는 각각 일관성이 보장되는 서로 다른 상태가 된다. 트랜잭션 수행이 보존해야 할 일관성은 기본 키, 외래 키 제약과 같은 명시적인 [[무결성]] 제약 조건들뿐만 아니라, A에서 B로 돈을 이체할 때 A와 B 계좌의 돈의 총합이 같아야 한다는 사항과 같은 비명시적인 일관성 조건들도 있다.<ref name="트랜잭션 성질2"/><ref name="트랜잭션"/><ref name="트랜잭션 성질"/><ref name="트랜잭션 성질3"/><ref name="트랜잭션 성질4"/><ref name="트랜잭션 성질5">kmmguumnn,  〈[https://starkying.tistory.com/entry/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98Transaction%EC%9D%B4%EB%9E%80 트랜잭션(Transaction)이란?]〉, 《티스토리》, 2019-03-03</ref>
  
또한, 각 노드가 꼭 저장하여아만 하는 원장의 크기를 줄이기 위한 프루닝(pruning)방법으로써 '''[[베리파이어블 프루닝]]'''(Verifiable Pruning) 기술이 개발, 채택되어 있다. 베리파이어블 프루닝은 삭제된 과거의 데이터와 현재 가지고 있는 데이터간의 정합성을 암호학적인 방법으로 검증 가능한 알고리즘이다. 이를 통해 현재의 트랜잭션을 합의하는 데 당장 필요하지 않은 데이터는 스토리지에서 삭제할 수 있고, 이 상태에서도 과거 데이터와의 정합성 검증과 해쉬값 참조가 가능하다. 나아가 이 베리파이어블 프루닝 기술을 응용하여, 새로 네트워크에 참여한 노드가 비교적 소량의 최근 데이터만을 다운로드 받아서 짧은 시간 안에 곧바로 네트워크에 기여가 가능한 구조가 구축되어 있다. 그리고 [[사물인터넷]](IoT) 장치 등 제한된 저장 용량만을 갖는 디바이스에서도 로커스체인의 완전 동작이 가능할 것으로 보인다.
+
* '''일관성 보장''' : 트랜잭션에서 일관성은 트랜잭션 수행 전/후에 데이터 모델의 모든 제약 조건(기본 키, 외래 키, 도메인, 도메인 제약조건 등)을 만족하는 것을 통해 보장한다. 예를 들어 Movie와 Video 테이블이 있을 때 Video 테이블의 기본 키(primary key)인 movie_id가 외래키로 존재한다고 가정한다. 만약 movie_id의 제약 조건이 Movie 테이블에서 변경되면, Video 테이블에서도 movie_id가 변경되어야 한다. 한 쪽의 테이블에서만 데이터 변경사항이 이루어져서는 안되는 것이다. 이때 트랜잭션의 일관성을 보장하기 위한 방법은 어떤 이벤트와 조건이 발생했을 때, 트리거(Trigger)를 통해 보장하는 것이다. 트리거는 '방아쇠'라는 뜻인데, 데이터베이스 시스템이 자동적으로 수행할 동작을 명시할 때 사용된다. , 어떤 행위의 시작을 알리는 것이다.<ref name="트랜잭션 성질2"/>
  
위와 같은 로커스체인의 특징은, IoT상의 디바이스 등 아주 적은 성능의 장치들이 제약없이 노드에 참여할 수 있게 하여, [[머신투머신]](M2M) 거래, 소매점 단말기, [[사물인터넷]](IoT), [[자율주행 자동차]] 등의 미래산업에 블록체인이 바로 적용될 있게 한다. 로커스체인의 개발자들은 초당 수십억 건의 이벤트를 처리해야 하는 게임 엔진 개발 경험을 살려 데이터 원장구조에서부터 합의알고리즘, 스토리지 및 네트워크 사용량을 최적화하기 위한 기술까지 로커스체인 프로젝트에 모두 담으려 하고 있다.
+
=== 고립성 ===
 +
고립성(isolation)이란 하나의 트랜잭션 수행시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장하는 것이다. 즉, 트랜잭션 끼리는 서로를 간섭할 수 없다. 트랜잭션이 실행하는 도중에 변경한 데이터는 이 트랜잭션이 완료될 때까지 다른 트랜잭션이 참조하지 못하게 하는 특성이다. 데이터베이스는 클라이언트들이 같은 데이터를 공유하는 것이 목적이므로 여러 트랜잭션이 동시에 수행되어야 한다. 이때 트랜잭션은 상호 간의 존재를 모르고 독립적으로 수행되어야 한다. 고립성은 격리성이라고도 하는데 이를 유지하기 위해서는 여러 트랜잭션이 동시에 접근하는 데이터에 대한 제어가 필요하다. 여러 트랜잭션이 동시에 수행되더라도 각각의 트랜잭션은 다른 트랜잭션의 수행에 영향을 받지 않고 독립적으로 수행되어야 한다. 한 트랜잭션에서 데이터베이스를 변경한 내용은 트랜잭션이 커밋되기 전까지는 다른 어떤 질의나 트랜잭션과도 고립되어야만 한다. 즉, 각 트랜잭션은 시스템 내에서 동시에 수행되고 있는 다른 트랜잭션들을 알지 못하는 것이다. 한 트랜잭션의 중간 결과가 다른 트랜잭션에게는 숨겨져야 한다는 의미인데, 이러한 성질이 보장되지 않으면 트랜잭션이 원래 상태로 되돌아갈 없게 된다. DBMS의 병행 제어 모듈이 트랜잭션의 고립성을 보장하며 예를 들어 설명하자면 하나의 트랜잭션이 A라는 계좌에서 작업을 하고 있을 경우 다른 트랜잭션이 A계좌에 대해 참조하거나 관여할 수 없고 작업이 끝날 때까지 대기해야 하는 것을 말한다.<ref name="트랜잭션 성질2"/><ref name="트랜잭션 성질3"/><ref name="트랜잭션 성질4"/><ref name="트랜잭션 성질5"/>
  
== 역사 ==
+
* '''고립성 보장''' : 병행처리 과정에서 트랜잭션의 고립성이 왜 보장되어야 하는지 알 수 있다. OS의 세마포어(semaphore)와 비슷한 개념으로 lock&excute unlock을 통해 고립성을 보장할 수 있었다. 즉, 데이터를 거나 쓸 때는 문을 잠궈서 다른 트랜잭션이 접근하지 못하도록 고립성을 보장하고, 수행을 마치면 언락(unlock)을 통해 데이터를 다른 트랜잭션이 접근할 수 있도록 허용하는 방식이다. 트랜잭션에서는 데이터를 읽을 때, 여러 트랜잭션이 읽을 수는 있도록 허용하는 공유 록(shared_lock)을 한다. 즉, 공유 록은 데이터 쓰기를 허용하지 않고 오직 읽기만 허용하는 것이다. 또한 데이터를 쓸 때는 다른 트랜잭션이 읽을 수도 쓸 수도 없도록 하는 배타 록(exclusive_lock)을 사용한다. 그리고 읽기, 쓰기 작업이 끝나면 언락을 통해 다른 트랜잭션이 록(lock)을 할 수 있도록 데이터에 대한 잠금을 풀어준다. 단, (lock)과 언락을 잘못 사용하면 데드락(deadlock)상태에 빠질 수 있다. , 모든 트랜잭션이 아무것도 수행할 수 없는 상태가 되는 것이다.<ref name="트랜잭션 성질2"/>
[[파일 : BloomTechnology_logo.png|썸네일|250픽셀|오른쪽|'''로커스체인'''(Locus Chain)의 개발을 맡고 있는 '''블룸테크놀로지'''(Bloom Technology) 로고]]
 
'실용가능한 퍼블릭 블록체인'목표로 로커스체인 개발을 책임지고 있는 [https://www.bloomtechnology.co.kr 블룸테크놀로지]는 한국게임산업의 1세대 개척자였던 이상윤 대표가 1994년 판타그램(Phantagram Limited)이라는 이름으로 설립한 회사이다. 판타그램은 파트너 회사인 [http://www.blueside.co.kr 블루사이드(Blueside Inc.)]와 함께 유명 게임 시리즈 '킹덤 언더 파이어(Kingdom Under Fire)', '나인티 나인 나이츠(Ninety Nine Nights)' 등을 만든 게임 엔진 개발회사이다. 20년 동안 판타그램은 마이크로소프트 사와 4개 이상의 콘솔 게임 타이틀을 성공적으로 출시했고 유수의 PC 게임 타이틀을 발표했다. 그중 '킹덤 언더 파이어: 크루세이더(Kingdom Under Fire: Crusaders)'는 2004년 대한민국게임대상을 수상하기도 했다. 하지만 킹덤 언더 파이어2는 약 1000억의 투자를 받았지만 10년이상 출시를 못하였고, 출시 후에도 흥행부진으로 심각한 경영난을 겪고있다. 게임 엔진 기술은 수십만 유저가 참여하여 실시간 초당 수십억개의 이벤트를 처리하기 위한 전문적인 기술로 블록체인과 같은 P2P 기술과 관련성이 높다. 판타그램은 3D 그래픽 최적화, 데이터 분산에 대한 기술력을 바탕으로 2017년 블록체인 개발 사업을 시작하고 2018년 법인명을 '블룸테크놀로지'로 변경했다. 블룸테크놀로지는 차세대 블록체인 플랫폼인 로커스체인의 개발을 맡았고 자회사인 '로커스체인 파운데이션(Locus Chain Foundation Pte. Ltd.)'은 사업전반을 맡고 있다.
 
  
== 주요인물 ==
+
=== 지속성 ===
* '''[[이상윤]]''': 로커스체인 파운데이션 대표 및 블룸테크놀로지 대표를 맡고 있다. 이상윤 대표는 10대였던 1987년 처음으로 8-bit PC상에서 상용 게임을 만들어 이를 한국과 일본에 판매했으며, 판타그램 및 블루사이드를 통해 "킹덤 언더 파이어" 게임시리즈를 비롯하여 [Forgotten Saga (PC)], [Kingdom Under Fire Crusaders (Xbox)], [Ninety Nine Nights (Xbox360)] 등을 디렉팅 및 프로듀싱하였다.
+
트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야 한다. 지속성(durability)은 트랜잭션의 성공 결과 값은 장애 발생 후에도 변함없이 보관되어야 한다는 것으로 트랜잭션이 정상적으로 완료된 경우에는 버퍼의 내용을 하드디스크(데이터베이스)에 확실히 기록해야 하며, 부분 완료(Partial Commit)된 경우에는 작업을 취소(Aborted)하여야 한다 즉, 정상적으로 완료 혹은 부분 완료된 데이터는 DBMS가 책임지고 데이터베이스에 기록하는 성질이 지속성이며 영속성이라고 표현하기도 한다.
 +
<ref name="트랜잭션 성질3"/><ref name="트랜잭션 성질4"/><ref name="트랜잭션 성질5"/>
  
* '''[[김세정]]''' : 로커스체인의 공동창업자이다. 게임 개발사 [[블루사이드]]의 대표이기도 하다. 2007년에는 문화관광부 표창장을 받기도 했다.
+
==특징==
 +
=== 무정지성 ===
 +
트랜잭션 기능의 대표적인 이점 중 하나는 무정지성의 향상이다. 즉, [[운영체제]] [[장애 (정보통신)|장애]] 등의 서버 장애가 발생하여 그로부터 데이터베이스를 재가동한 때에 '장애 직전까지의 커밋 결과를 손실하지 않고 마치는 것'이 가능하다. 트랜잭션을 지원하지 않는 데이터베이스의 경우 OS 장애뿐만 아니라 데이터베이스 프로세스가 비정상적으로 종료하기만 해도 데이터베이스가 손상될 수 있다. 깨진 데이터베이스를 복구하려고 해도 일부 데이터가 없어지거나 완전히 복구되지 않는 등 완전한 회복이 불가능한 경우도 많다. [[오라클]](Oracle)과 InnoDB 같은 트랜잭션 대응의 데이터베이스에서는 이러한 문제가 발생하지 않는데, REDO 로그(데이터베이스에서 수행한 작업을 다시 실행하는 로그)를 이용한 아키텍처로 무정지성을 보장하고 있기 때문이다.
  
* '''[[주영현]]''': 1998년 판타그램에 합류한 이후 드래곤플라이, 엔플레버, 블루사이드 등을 거치면서 게임 엔진 및 게임 기술 개발 디렉터를 역임했다. 블룸테크놀로지의 테크니컬 디렉터로서 로커스체인의 기술 개발을 책임지고 있다.
+
* '''REDO 로그''' : 열 값과 인덱스를 갖는 데이터 파일에는 커밋을 할 때마다 기록을 하는 것이 아니라 캐시 영역에 보관해 두고 정기적으로 디스크에 기록하는 동작을 하는데 REDO 로그 파일이 최신 커밋 정보를 가지고 있는 반면, 본체의 데이터 파일은 오래된 데이터를 가지고 있게 된다. 그래도 캐시 영역에 최신 데이터가 있기 때문에 데이터 파일에 이전 데이터밖에 없더라도 애플리케이션에서 보면 최신 데이터를 읽고 쓸 수 있어 모순된 상태가 되지는 않는다. 서버 장애 등의 이유로 데이터베이스가 멈춰서 재기동을 하게 되는 경우 데이터 파일이 이전 데이터밖에 남지 않았을 때 REDO 로그의 내용을 데이터 파일에 적용시켜 나감으로써 데이터 파일과 REDO 로그의 LSN과 일치시키는 작업을 수행한다. 이 과정을 충돌 복구(Clash Recovery)라고 한다.  
  
* '''[[이길호]]''': 1987년부터 게임 프로그래머로 일했으며 1994년 판타그램의 설립자 중 하나로 개발 책임 및 매니지먼트를 맡았다. 로커스체인에 합류해서는 암호 기술 및 매니지먼트를 돕고 있다.
+
==과정==
 +
[[파일:트랜잭션의 필요성.png|500픽셀|섬네일|트랜잭션의 필요성]]
 +
[[파일:트랜잭션의 상태.png|500픽셀|섬네일|트랜잭션의 상태]]
 +
[[파일:커밋(COMMIT).png|500픽셀|섬네일|커밋(commit)]]
 +
[[파일:롤백(ROKKBACK).png|500픽셀|섬네일|롤백(rollback)]]
  
* '''[[장순목]]''' : 30년 이상 개발경력을 가지고 있으며  와이디온라인 CTO , 디지타워 엔터테인먼트 CEO, 나인버드게임즈 CEO 등을 역임했다. 게임을 비롯해 보안시스템, 비전센서, 시뮬레이터,  AI, IOT 등의 개발 및 운용 경험이 있고 스크린야구와 관련된 특허 10여종의 발명자다.
+
트랜잭션은 거래의 안전성을 확보하는 방법이다. A 은행에서 B 은행으로 송금을 하다가 송금 도중 알 수 없는 오류가 발생하여 A 은행 계좌에서 돈이 빠져 나갔는데 B 은행 계좌에 입금되지 않았다. 이때, A 은행 계좌의 출금을 취소하거나 출금된 금액만큼 B 은행 계좌로 다시 송금하면 된다. 하지만 이러한 방법은 번거롭고 더 심한 오류를 발생시킬 수 있다. 이때 거래가 성공적으로 모두 끝난 후에야 이를 완전한 거래로 승인하고, 거래 도중 오류가 발생했을 때는 이 거래를 아예 처음부터 없었던 거래로 되돌려 이러한 문제를 예방할 수 있다.
  
* '''[[오구라 타케유키]]''': 20년 넘게 IT 업계에서 프로그래머로 활동했으며 개발 프로젝트의 최고 책임자를 역임했다. GPGPU 프로그램과 프로토타입 등에 풍부한 경험을 갖고 있으며 마이크로소프트, Dena, 그리고 기타 유수의 세계적인 IT 업체에서 수석 프로그래머로 활동했다.
+
이렇게 거래의 안전성을 확보하는 방법이 바로 트랜잭션이다. 데이터베이스에서는 테이블에서 데이터를 읽어온 후 다른 테이블에 데이터를 입력하거나 갱신, 삭제하는 데 처리 도중 오류가 발생하면 모든 작업을 원상태로 되돌린다. 데이터베이스에서는 처리 과정이 모두 성공했을 때만 최종적으로 데이터베이스에 반영한다. 1, 2번까지 잘 실행되다가 3번 작업 시 소프트웨어가 중단되거나 하드웨어 고장이 발생해 작업에 오류가 생기게 된다면 2번까지의 모든 작업을 취소하고 트랜잭션 작업 전인 데이터베이스 초기 상태로 돌아가게 된다.<ref name="트랜잭션2">쩨리쩨리, 〈[https://jerryjerryjerry.tistory.com/48 (SQL) Transaction(트랜잭션)]〉, 《티스토리》, 2018-04-24</ref>
  
* '''[[문영배]]''' : IMF 및 국제기구등에 블록체인 기반의 CBDC, 국내 기업들의 블록체인 기반 다양한 프로젝트에 컨설팅을 수행하고 있다. 한국블록체인협회 부회장을 역임중이다.
+
===상태===
 +
트랜잭션에는 사용자가 적은 쿼리문과 데이터를 최종적으로 데이터베이스에 반영하는 커밋과 실패했을 때 시점으로 다시 되돌아가는 롤백이 있다.
 +
* '''활동'''(Active) : 트랜잭션이 실행 중인 상태이다.
 +
* '''실패'''(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태이다.
 +
* '''철회'''(Aborted) : 트랜잭션이 비정상적으로 종료되어 롤백 연산을 수행한 상태이다.
 +
* '''부분 완료'''(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, 커밋 연산이 실행되기 직전의 상태이다.
 +
* '''완료'''(Committed) : 트랜잭션이 성공적으로 종료되어 커밋 연산을 실행한 후의 상태이다.<ref name="트랜잭션"/>
  
* '''[[스티브 오]]''' : 미국 스탠퍼드 로스쿨 법학 박사이고, 삼성전자 기업변호사와 한국마이크로소프트 법무팀 대표 변호사 등 국내외 수많은 유수 기업의 법률 고문 역할을 했다.  
+
=== 연산 ===
 +
==== 커밋 ====
 +
[[커밋]](commit) 연산은 모든 작업들을 정상적으로 처리하겠다고 확정하는 명령어로서, 처리과정을 데이터베이스에 영구적으로 저장하는 것이다. 커밋을 수행하면 하나의 트랜잭션 과정을 종료하는 것이다. 커밋을 수행하면 이전 데이터가 완전히 업데이트된다.<ref name="트랜잭션"/> 우측 그림에서 첫 번째 커밋 후 그 뒤에 Update 문으로 데이터를 갱신하고 Delete 문으로 데이터를 삭제한 후 Insert 문을 사용해 데이터를 삽입한다. 만약 이 모든 과정이 오류 없이 수행되었다면 지금까지 실행한 모든 작업을 데이터베이스에 영구 저장하라는 명령으로 커밋을 수행한다.<ref name="트랜잭션2"/>
  
 +
==== 롤백 ====
 +
[[롤백]](rollback) 연산은 작업 중 문제가 발생하여 트랜잭션의 처리과정에서 발생한 변경사항을 취소하는 명령어이다. 이 트랜잭션의 일부가 정상적으로 처리되더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소한다는 특징이 있다. 트랜잭션이 시작되기 이전의 상태로 되돌린다. 즉, 마지막 커밋을 완료한 시점으로 다시 돌아간다. 커밋하여 저장한 것만 복구한다. 롤백 시에는 해당 트랜잭션을 재시작하거나 폐기한다.<ref name="트랜잭션"/> 우측 그림에서 롤백 명령은 마지막으로 수행한 커밋 명령까지만 정상 처리된 상태로 유지한다. 그 이후에 수행했던 모든 DML 명령어 작업들을 취소시켜 이전 상태로 원상 복귀 시킨다. 트랜잭션은 이렇듯 all or nothing(모든 것을 수행하던지 아무것도 하지 말던지) 방식으로 DML 명령어들을 처리한다.<ref name="트랜잭션2"/>
  
== 특징 ==
+
====세이브포인트====
=== DAG-AWTC 원장구조 ===
+
[[세이브포인트]](save point)'임시저장' 또는 '부분저장'과 같은 맥락으로 이해할 수 있다. 보통 롤백을 명시하면 삽입, 삭제, 업데이트 등의 작업 전체가 취소되는데, 세이브포인트는 전체가 아닌 특정 부분에서 트랜잭션을 취소하기 위해 사용한다. 세이브포인트를 쓰면 현재의 트랜잭션을 작게 분할하는 것이 가능하다. 세이브포인트는 여러 개의 [[에스큐엘]](SQL)문의 실행을 수행하는 트랜잭션의 경우에 사용자가 트랜잭션 중간 단계에서 세이브포인트를 지정할 있다. 세이브포인트를 쓰려면 취소하려는 지점을 명시한 뒤, 그 지점까지 작업을 취소하는 식으로 사용하는데 이 지점을 세이브포인트라고 한다. 세이브포인트를 지정한 뒤 롤백 투 세이브포인트 이름;(rollback to save point name;)을 실행하면 해당 세이브포인트 지점까지 처리한 직업이 [[롤백]]된다.
[[파일 : DAG_AWTC.png|썸네일|400픽셀|오른쪽|선형체인구조와 '''로커스체인'''(Locus Chain)'''DAG-AWTC''' 비교]]
 
'''고속 대량 처리를 위한 원장 구조''': AWTC원장 구조는 로커스체인의 고속 처리 및 분산 처리에 있어 중요한 기술적 요소이다. 비트코인, 이더리움 등의 많은 블록체인이 선형 체인구조를 갖고 있는 반면 로커스체인은 DAG(Directed Acyclic Graph) 기반의 비선형 원장구조인 AWTC(Account-Wise Transaction Chain)를 사용한다. 이 구조는 이름 그대로 어카운트 단위로 트랜잭션을 관리하는 병렬형 구조이며 [[나노코인]]의 [[블록격자]](block lattice)와 유사한 형태를 가진다. 선형 체인구조는 이전 블록에 다음 블록이 연결될 있는 곳이 한곳밖에 없고, 여러 노드가 같은 연결지점에 동시에 블록을 추가하려 하는 병목이 발생한다. 반면 로커스체인의 DAG-AWTC를 비롯한 블록 격자 구조는 트랜잭션을 추가하는 지점이 어카운트 수만큼 존재하고, 그 지점에 대해서는 소유 어카운트만이 독점적으로 기록이 가능하므로 충돌이 발생하지 않는다. 또한 트랜잭션을 추가한 어카운트가 자명하므로 어카운트 소유자 본인이 악의적인 사용자가 아니라면 트랜잭션은 추가 즉시 거의 확정된다. 이러한 성질을 갖는 로커스체인의 원장구조는 기존 블록체인이 가지고 있던 거래처리 지연 문제를 근본적으로 해결하기 위한 주요 기술적 특징 중 하나이다.
 
  
=== Locus BFT 합의알고리즘 ===
+
== 스케줄 종류 ==
[[파일 : 로커스체인합의알고리즘.png|썸네일|400픽셀|오른쪽|'''로커스체인'''(Locus Chain)의 합의알고리즘]]
+
=== 직렬 스케줄 ===
'''확정 완결적 합의''': DAG-AWTC 구조는 기본적으로 어카운트간 충돌이 없고 이후에도 결과가 뒤집힐 확률이 거의 없어 소매처리시간(수 초) 이내에 거래가 확정된다. 대부분의 경우 트랜잭션은 정상적으로 추가되고 확정되지만, 만약 어카운트 소유자가 악의적이라면 더블스펜딩과 같은 문제를 발생시키는 것이 가능하다. 로커스체인에서는 수분 간격으로 정기적으로 BFT합의를 실시, 이 기간 동안 문제가 없었다는 사실을 확정하거나, 만약 문제가 생겼을 경우 이를 해결한다.
+
직렬 스케줄(Serial schedule)은 순서대로, 하나씩 트랜잭션을 실행하는 것으로 트랜잭션 하나의 실행이 완료되면 다른 트랜잭션을 시작하는 방식으로 하나씩 차례대로 실행하는 스케줄로서 트랜잭션이 실행되는 동안 다른 트랜잭션의 영향을 받을 수 없으므로 모순이 발생하지 않는다.<ref name="트랜잭션3"/>
  
AWTC구조에서 더블 스펜딩은 한 어카운트의 트랜잭션 체인에 동일한 일련번호를 갖는 트랜잭션이 동시에 둘 이상 발생하는 경우로 명확하게 정의된다. 동시에 발생한 서로 다른 트랜잭션이 네트워크를 거쳐 전파되는 과정에서 통과한 각 노드상에서, 노드가 갖는 지분(PoS)에 따른 선택(pseudo-vote)이 발생하면서, 더 많은 지지를 받은 트랜잭션이 1차적으로 결정된다(비확정합의). 그 다음, 확률적지분증명(Stochastic PoS)을 통해 선출된 BFT참여 노드가 주기적(2분 정도 간격)으로 원장 상태를 확정해 거래의 완결성을 최종 확보한다(확정합의).
+
=== 직렬화 스케줄 ===
 +
직렬화 스케줄(Serializable schedule)은 병행 제어, 직렬 스케줄 장점을 가진 것으로 트랜잭션들이 동시에 자료 접근 연산들을 교차하며 실행시키면서도 결과가 직렬 스케줄과 동일한 스케줄이다. , 병행 처리하지만 적절한 제어 조치를 취함으로써 일관성을 유지하는 스케줄로서 병행 제어에서 필요한 스케줄이다. 즉, 병행 제어 스케줄은 직렬성을 유지할 수 있다. 직렬성이란 트랜잭션들의 처리 결과가 직렬 처리와 동일한 효과를 가지는 스케줄 특성이다.<ref name="트랜잭션3"/>
  
DAG는 병렬형 구조이기 때문에 각 노드가 병렬적으로 원장을 갱신한다. 따라서 현재 리얼타임의 절대적인 원장 상태를 특정하는 것은 불가능하다. 로커스체인은 샤드 내에서 데이터가 충분히 전송되는 데 필요한 시간을 감안하여, 이 시간만큼 약간의 과거 시점에 대한 합의를 시도함으로써 DAG 상에서 BFT 확정합의를 최초로 구현했다고 2019년 2월 언론에 [https://www.locuschain.com/ko/socialView?blogSeq=77&blogLanguage=ko&blogCategory=press 발표]하였다. 로커스체인의 합의 알고리즘은 실행 중에도 새로운 트랜잭션의 발생을 막지 않아 DAG의 고속처리에 간섭하지 않으므로 기존의 stop-and-go방식이었던 BFT의 성능적 단점을 개선하였다.
+
== 병행처리 ==
 +
다수의 사용자가 데이터베이스에 요청을 보내게 되면 이러한 요청들을 처리할 방법이 필요하다. 만약 하나의 요청을 끝내고 다른 요청을 수행하는 방식이라면 처리시간이 매우 오래 걸린다. 그래서 병행처리 방식으로 처리를 한다. 트랜잭션을 병행처리하면 처리 효율이 높아지지만, 처리 과정에서 동일한 자료를 동시에 접근해서 오류가 생길 수 있다.
 +
:{|class=wikitable width=700 style="background-color:white; margin:0 auto;"
 +
|+병행처리의 문제점
 +
!align=center style="background-color:ashgray"|종류
 +
!align=center style="background-color:ashgray"|내역
 +
!align=center style="background-color:ashgray"|문제점
 +
|-
 +
|align=center|갱신 유실 문제
 +
|align=center|두 트랜잭션이 동시에 동일한 자료를 갱신
 +
|align=center|첫째 갱신이 유실
 +
|-
 +
|align=center|오류 읽기 문제
 +
|align=center|갱신하는 도중에 다른 트랜잭션이 읽기
 +
|align=center|낡은 자료 읽기
 +
|-
 +
|align=center|잘못된 요약
 +
|align=center|두 자료를 갱신하는 도중에 읽기
 +
|align=center|요약 결과 오류
 +
|-
 +
|align=center|무결성 제약조건
 +
|align=center|두 자료의 제약조건을 검사하지 않고 갱신
 +
|align=center|일관성 위반
 +
|}
  
기술적으로 DAG와 BFT를 동시 구현하는 것이 유의미한 이유는, 이것이 이후 스토리지 문제와 네트워크 부하 문제를 해결할 프루닝 및 샤딩 기술의 전제조건이 되기 때문이다. 블룸테크놀로지는 BFT 확정합의 방식의 DAG-AWTC 원장 시스템에 대한 특허 출원을 신청한 상태로 알려져 있다.
+
따라서 병행제어가 필요한데, 병행제어가 필요한 이유는 다음과 같다.
 +
* '''분실된 업데이트 문제'''(The Lost Update Problem) : 두 개의 트랜잭션이 동일한 아이템에 접근하여 서로의 연산이 중첩될 때 결과적으로 올바르지 않은 값이 저장될 수 있다.
 +
* '''임시 업데이트 문제'''(The Temporary Update Problem) : 한 트랜잭션이 값을 업데이트하다가 중간에 트랜잭션이 실패하였다. 하지만 롤백하기 이전에 다른 트랜잭션이 값을 읽게 되면 올바르지 않은 값을 읽는 것이다.
 +
* '''잘못된 요약 문제'''(The Incorrect Summary Problem) : 한 트랜잭션이 aggregate 함수(Sum, Max, Min 등)를 실행하고 있는데, 다른 트랜잭션이 이 값들 중 하나를 업데이트하고 있을 때 aggregate 트랜잭션의 값이 업데이트되기 이전을 사용할 때이다.
  
=== Stochastic PoS 기반 공정한 커미티 선출 ===
+
데이터베이스 병행처리의 목적은 1) 트랜잭션의 충돌을 방지하기 위해 고립성을 강제하기 위함, 2) 데이터베이스의 일관성을 보존하기 위함, 3) read-write 또는 write-write 충돌을 막기 위함의 세 가지로서, 스케줄의 진정한 목적은 충돌 스케줄을 찾아 직렬화 스케줄을 만드는 것이다.<ref name="트랜잭션3">jhkang-dev, 〈[https://jhkang-tech.tistory.com/103 (데이터베이스) 트랜잭션]〉, 《티스토리》, 2018-11-28</ref>
'''완전한 탈중앙화''': 로커스체인은 [[알고랜드]]의 무허가형 순수지분증명방식과 유사한 알고리즘을 사용한다. 더 자세히 설명하자면 로커스체인은 [[ 확률적지분증명 ]] (Stochastic PoS: 지분이 많을수록 커미티로 선출될 확률이 높아지는 방식)을 기반으로 무작위검증가능함수(VRF: Verifiable Random Function)에 의해 매 라운드마다 합의 알고리즘에 참여하는 새로운 프로포저 커미티를 선출한다. 누가 프로포저로 선출될지 미리 알 수 없기 때문에 해킹, 담합 등 악의적인 공격이 어렵다. 또한 최근 투표 참여 횟수 및 네트워크 참여도(온라인 시간 등)에 기반해 매 라운드마다 새로운 밸리데이터 커미티를 선출, 프로포저가 제안한 라운드 상태에 대해 PBFT 방식에 따라 2회의 투표를 거쳐 결과를 확정한다. 이러한 방법은 합의에 참여할 노드(프로포저, 밸리데이터)를 특정하거나 미리 예측할 수 없기 때문에 악의적 공격에 의한 조작이 어려워져 합의결과의 공정성과 네트워크의 안정성(security)이 확보된다고 로커스체인은 주장한다.
 
  
=== 베리파이어블 프루닝 ===
+
== 록킹 ==
[[파일:배리파이어블프루닝.png|썸네일|400픽셀|오른쪽|'''로커스체인'''(Locus Chain)'''베리파이어블 프루닝''']]
+
트랜잭션이 자료를 배타적으로 접근할 수 있으면 그 트랜잭션이 완료된 후에 다른 트랜잭션이 실행되기 때문에 직렬성이 확보된다. 자료를 배타적으로 접근하는 방법이 바로 록킹 기법이다. 트랜잭션의 ACID 특성을 해치는 접근 연산은 주로 갱신이다. 읽기 연산은 자료 값을 바꾸지 않는다. 하지만 읽기 연산 도중에 갱신을 하게되면 일관성 유지가 어려울 수 있다. 트랜잭션에는 공유 록과 배타 록 2가지가 있다.
 +
* '''공유 록''' : 특정 자료 Q에 공유 록을 걸면 다른 트랜잭션이 이 자료를 갱신할 수 없다. 공유 록(Shared Lock)이 걸린 Q는 다른 트랜잭션에 의해서 읽혀질 수 있다.<ref name="트랜잭션3"/>
 +
* '''배타 록''' : 트랜잭션이 자료를 기록할 때 배타 록(Exclusive Lock) X를 걸어야 한다. 록 X를 가진 트랜잭션은 자료를 읽을 수도 있고, 갱신할 수도 있다. 배타 록 X가 걸린 자료는 공유 록 S를 가진 트랜잭션들에 의해서 읽혀질 수 없는데 더디리드(Dirty Read)를 방지하기 위해서이다.<ref name="트랜잭션3"/>
  
'''노드 저장 부하감소''': 로커스체인은 일정 기간(하루) 이전의 과거 데이터를 능동적으로 로컬환경에서 삭제(프루닝)하여 로컬 데이터의 양을 줄이면서도, 블록체인의 데이터 검증 기능에 지장을 주지 않는 '''[[베리파이어블 프루닝]]'''(Verifiable Pruning) 기술을 개발했다고 2019년 7월초 [https://www.locuschain.com/ko/socialView?blogSeq=187&blogLanguage=ko&blogCategory=tech 발표]하였다.
+
== 복제 ==
 +
복제 구성에서 있어서 [[슬레이브]]에서는 [[마스터]]에서 전송되어 온 업데이트성 [[쿼리]]를 실행하는 역할을 한다. 이 처리는 사실 업데이트성 쿼리를 실행하는 것만으로는 충분하지 않고 슬레이브는 마스터에서 보낸 업데이트성 쿼리 중에서 어디까지를 실행했는지라는 정보도 관리할 필요가 있다. 그렇게 처리하지 않으면 도중에 슬레이브가 멈추었을 경우 어디서부터 다시 시작하면 좋을지 알 수 없기 때문이다. 엄밀하게는 이 정보원들은 동일한 트랜잭션에서 원자성 있게 갱신해야 한다. [[마이에스큐엘]](MySQL)에서는 마스터가 트랜잭션이 커밋될 때마다 그 생신 에스큐엘(SQL) 문을 바이너리 로그에 기록할 때, 슬레이브에서는 바이너리 로그의 내용을 싫어하여 나가지만, 현재 어디까지 실행했는지를 관리하기 위해 실행을 마친 바이너리 로그의 위치 정보를 관리하는 InnoDB 테이블을 제공한다. 그리고 갱신 에스큐엘 문의 실행과 위치 정보 갱신을 동일한 트랜잭션에서 실시한다. 애플리케이션의 관점에서 모든 업데이트성 쿼리가 UPDATE 문 한 번밖에 없는 자동 커밋 쿼리라 할지라도 복제 구성과 조합한 시점에서 업데이트성 쿼리의 실행에 더하여 복제 상태 업데이트 처리도 모두 한 개의 트랜잭션으로 하지 않으면 안된다. 이것들이 하나의 트랜잭션으로 되어 있으면 어느 타이밍에 크래쉬해도 갱신 확정된 쿼리를 또다시 복제하거나, 반대로 복제를 날려 버리는 일은 없게 될 것이다.  
  
늘어나는 원장 사이즈 문제<ref>현재의 저속이 아닌 비자 카드의 최대 처리량이라고 하는 4k TPS(Transaction Per Second)에 이르는 실용적인 성능을 내는 블록체인을 가정하고, 트랜잭션을 한 번 전송하는 데 드는 용량이 0.5kB 정도라고 가정했을 때 노드가 감당해야 하는 원장 사이즈는 매일 약 172GB 정도씩 늘어난다. (계산법: 0.5kB/Tx * 4kTx/sec * 3.6ksec/hour * 24hour/day = 172.8GB/day)</ref>를 해결하기 위해 오래된 데이터를 단순 삭제하여 원장의 크기를 줄이는 일반적인 프루닝과 달리, 로커스체인의 베리파이어블 프루닝은 '''스큐드머클트리(Skewed Merkle Tree)''' <ref>스큐드머클트리는 이진 머클트리와 링크드리스트의 복합체로서 머클트리의 데이터 검증 능력을 링크드리스트에 적용시킨 구조이다.</ref> 구조를 사용하여 과거 대부분의 데이터가 로컬 환경에 존재하지 않는 상황에서도 데이터의 정당성을 검증할 수 있는 기술이다.
+
== 블록체인 ==
 
+
[[파일:트랜잭션블록체인.png|800픽셀|섬네일|가운데|블록체인에서의 트랜잭션]]
로커스체인은 관련된 모든 데이터를 전부 보유하지 않아도 필요한 부분의 해시값만으로 정당성 검증이 가능하기 때문에 로컬 노드의 데이터 저장량이 대폭 줄어든다. 시중의 SD카드정도의 저장량으로 노드 운용이 가능하다는 사실은, 누구나 부담 없이 로커스체인 네트워크에 참여할 수 있는 중요한 기반이 되고, 이는 높은 탈중앙화를 달성하는 데 중요한 요소이다.
 
 
 
여기에 추가로 로커스체인은 초당 수천 트랜잭션이 수년 이상 쌓인 상황에서도 먼 과거에 발생한 데이터를 효율적으로 검증할 수 있도록 필요한 계산 정보량을 지수함수적으로 단축시키는 알고리즘인 '''계층적 스큐드머클트리(Hierarchical Skewed Merkle Tree)'''를 도입했다고 한다. 이로써 노드의 스토리지 부담을 줄이면서 동시에 고속 검증이 가능한 블록체인을 구현하였다고 한다.
 
 
 
반면에, 일부 노드 상에만 데이터가 보존되는 경우 주목도가 낮은 데이터는 아무도 저장하지 않고 사라져 버리는 경우가 발생할 수 있다는 우려가 있다. 이런 우려에 대해, 로커스체인에서는 우선 각 어카운트의 과거 이력(history)은 기본적으로 어카운트 자신 또는 자신이 위임한 노드가 저장하므로, 소유자 본인은 언제나 자신의 과거 이력의 열람 및 백업이 가능하므로 대부분의 경우 문제가 없다고 한다. 이것으로 불충분하다면 로커스체인 외부의 과거 데이터의 저장에 특화된 별도 기구에 저장을 맡길 수 있는데, 예를 들어 수백테라바이트의 저장공간을 가진 디렉토리 서비스 운영 사업자가 코인을 대가로 과거 트랜잭션 데이터의 열람 서비스를 제공하는 등의 전개를 생각할 수 있다. 로커스체인 외부에서 읽은 과거의 데이터도 모든 로커스체인 노드에서 검증할 능력이 있다는 것을 이용하여, 저장과 검증 기능을 각각 잘하는 쪽에 일임함으로써 굳이 로커스체인 위에 모든 데이터를 저장하지 않고도 블록체인의 모든 이점을 효율적으로 누릴 수 있을 것이라고 한다.
 
 
 
블룸테크놀로지는 베리파이어블 프루닝에 대한 특허 출원을 신청한 상태로 알려져 있다.
 
{{인용문|"'''로커스체인'''은 '''베리파이어블 프루닝'''을 통해 이미 원장에서 지워진 데이터라고 해도 나중에 참ㆍ거짓의 증명이 가능한 데이터 구조를 가지게 함으로써 극단적인 원장 사이즈 축소가 가능해졌으며, ​일자형체인 구조가 아닌 '''DAG-AWTC''' 원장구조를 사용해 수초 내 거의 모든 요청을 처리할 수 있게 됐다"<ref>여용준 기자, <[http://www.enewstoday.co.kr/news/articleView.html?idxno=1318677 로커스체인, 플랫폼 기술 집약한 엔터프라이즈 메인넷 개발]>, 《이뉴스투데이》, 2019-07-04</ref><br>
 
&nbsp; - 주영현 테크니컬 디렉터}}
 
 
 
=== 다이내믹 샤딩 ===
 
[[파일: 다이내믹샤딩.png|썸네일|400픽셀|오른쪽|'''로커스체인'''(Locus Chain)의 '''다이내믹샤딩''']]
 
'''계산량 증가 및 노드부하감소''': 로커스체인은 노드가 부담하는 네트워크 사용량<ref>고속 블록체인의 초당 처리량을 4K TPS로 가정했을 때 노드가 감당해야 하는 네트워크 통신량은 초당 2MB(=0.5kB/Tx * 4kTx/sec )정도이다. 이는 일반 가정집에서 사용하는 네트워크 대역폭이 100Mbit/s라고 할 때 전체의 20%에 해당하는 수치이다. 이것은 언뜻 작은 수치로 보일 수 있지만 P2P 가십 프로토콜에서 통신을 주고받는 리피트(repeat)를 고려하면 초당 20MB 정도로 일반인이 가정집 PC로 노드에 참여하기에는 어렵다고 볼 수 있다.</ref>을 낮추고 네트워크 전체의 트랜잭션 처리량을 높이기 위해 다이내믹 샤딩을 도입한다고 한다.
 
 
 
[[샤딩]]이란 네트워크 혹은 원장 상태를 샤드(shard) 단위로 작게 쪼개는 기술이다. 일반적인 샤딩은 통신 비율이 샤드 수에 비례해 증가하고 샤드 간 데이터 참조 및 검증이 어렵다는 단점이 있다. 또한 샤드마다 트랜잭션의 빈도, 노드의 수 등에서 차이가 날 경우 네트워크 안정성에 불균형이 발생할 수 있다. 로커스체인은 이런 문제를 해결하기 위해 네트워크 사용량에 따라 적절한 샤드 수를 조절하는 한편 알고리즘으로 샤드간 균형을 유지하는 다이내믹 샤딩(Dynamic Sharding: 동적 샤딩)을 적용해 성능이 한쪽으로 치우치는 것을 방지하겠다는 계획이다. 로커스체인은 원장 구조가 어카운트 별(AWTC)로 되어 있기 때문에 샤드간 불균형이 일어났을 경우 계정 단위로 샤드를 재배치하여 샤드의 수와 사이즈, 밸리데이터 비율 등을 조절하는 것이 용이해 보인다. 다이내믹 샤딩을 적용하면 한 노드가 감당해야 하는 네트워크 사용량은 샤드 수를 N 으로 할 때 2/N 으로 줄어들고 동일 노드의 네트워크 사용량 대비 네트워크 전체 TPS는 그만큼 증가하게 되는데, 여기에 추가적으로 원장을 쪼개는 스테이트 샤딩을 더해 스토리지 사용량 역시 샤드 수만큼 추가적으로 나눌 계획.  2020년 3월 개발 완료하였다
 
7월 초순경 다이나믹샤딩까지 적용된 퍼블릭블록체인 공개테스트가 진행될 예정이다.
 
 
 
([http://m.dtoday.co.kr/news/articleView.html?idxno=352580&fbclid=IwAR30zqNTAGkNR_qaLY4bevg5gs5E1aVbYzV22Hn0L2MAwa9ElcEue60EG1g#_enliple 기사]가 올라왔다.
 
 
 
=== 양자내성 암호서명 ===
 
'''암호학적 미래대비성''': 블록체인 프로젝트에 큰 위협이 되는 것 중 하나가 바로 양자컴퓨터의 등장이다. 양자컴퓨터 시대가 도래하면 현재 주류로 사용되고 있는 많은 서명 알고리즘이 무효화될 것으로 예상되고, 이에 전 세계 많은 암호학자들이 양자컴퓨터에 대비한 양자내성암호(PQC) 연구를 진행하고 있다. 다만 지금까지 발표된 양자내성암호는 현재의 비 양자내성 암호(non-PQC)에 비해 계산량과 데이터량이 막대하여, 개인용 PC나 모바일기기에서 처리하기에는 성능 부담이 있다. 그리고 양자내성암호는 아직 표준이 정착되지 않아 실제 사용했을 때 안전한가에 대한 수학적, 기술적 검증이 부족한 점이 있다.
 
 
 
로커스체인은 이러한 상황을 고려하여 서명 체계를 마스터 서명과 노멀 서명으로 이원화했다고 한다. 일반적인 트랜잭션에서는 현재의 암호체계를 적용한 노멀 서명과 이를 위한 키(페어)를 사용하고, 노멀키를 분실하거나 타인에게 노출되었을 때는 양자내성암호를 적용한 마스터 서명을 사용해 노멀키를 교체하는 방식이다. 마스터 서명은 꼭 필요한 경우 이외에는 사용하지 않기 때문에 양자내성암호의 데이터량 및 계산량 부담이 적다. 그리고 노멀 서명은 키 이외에 알고리즘 자체를 플러그인 방식으로 교환하는 것이 가능하다. 향후 양자컴퓨터가 상용화되거나 개인용PC로 양자내성암호 알고리즘을 처리 가능한 시대가 오면 로커스체인은 노멀 서명 자체를 양자내성 알고리즘으로 교체하는 것이 가능하다고 주장한다.
 
 
 
그리고 양자내성암호에 대한 안전성 자체도 아직 증명되지 않았으므로 마스터 서명은 당분간 양자내성암호와 기존의 암호시스템을 병렬로 사용한 하이브리드 체계로 운영한다는 계획이다. 향후 양자내성암호서명 알고리즘에 취약점이 발견되어도 현용 암호서명 알고리즘으로 커버가 가능하며, 나아가 문제가 없는 마스터 서명 알고리즘으로 넘어갈 수 있는 migration방식을 연구하고 있다고 한다.
 
 
 
=== 데이터 위변조 검증 API ===
 
로커스체인 개발팀은, 블록체인 기술의 중요한 포인트는 데이터의 보관보다 제출된 데이터의 위변조와 정당성을 오픈된 환경에서 누구나 검증 가능하다는 점에 있다고 주장한다. 많은 블록체인 프로젝트에서 기존의 DBMS(Database Management System) 대신 블록체인 원장에 직접 데이터를 담으려는 노력을 하고 있으나, 로커스체인 개발팀의 주장은 블록체인 플랫폼이 기존 DBMS의 대량의 데이터 저장과 완전 무결한 트랜잭션 처리 기능을 대체하는 것은 어렵다는 입장이다. 대신, 로커스체인은 다른 DBMS등의 방법으로 저장된 데이터의 정당성과 위변조 여부를 먼 미래 시점에서도 효율적으로 검증 가능한 능력을 갖고 있다고 주장한다.
 
 
 
이러한 입장에서 로커스체인은, 사용 단체가 개별적으로 독자 블록체인 시스템을 구축하지 않아도, 로커스체인의 위변조 검증API를 통해 데이터의 위변조를 검증할 수 있도록 하는 플랫폼을 개발하였다고 2019년 7월 [https://www.locuschain.com/ko/socialView?blogSeq=196&blogLanguage=ko&blogCategory=press 발표] 하였다.
 
 
 
== 전망 ==
 
 
 
사람 사이의 직접 거래뿐만이 아니라 사람-디바이스, 디바이스-디바이스 간의 거래 비율이 기하급수적으로 늘어나는 미래에는 탈중앙화의 중요성이 수면 위로 떠오를 것이다. 미국 IT 시장조사 기업인 IDC(International Data Corporation)는 앞으로 연결될 IoT 디바이스의 수가 2025년까지 416억개이며 모든 디바이스가 만들어내고 소비하는 데이터 양이 79.4제타바이트(ZB)에 달할 것으로 전망했다.
 
<ref> Michael Shirer, [The Growth in Connected IoT Devices Is Expected to Generate 79.4ZB of Data in 2025, According to a New IDC Forecast], IDC, 18 Jun 2019</ref> 머신끼리 서로 수없이 주고받는 통신과 여기에서 파생되는 데이터를 처리하려면 해킹, 담합, 조작 등 범죄에 악용되거나 단일장애지점(single point of failure)이 발생할 가능성이 있는 현재의 중앙화된 서버-클라이언트 방식은 사용하기 어려워 보인다.
 
 
 
로커스체인의 주장대로 저용량 기기에서도 블록체인이 충분히 동작할 수 있도록 개발이 된다면, 블록체인 기술의 실용화에 도움이 될 것으로 전망된다.
 
특히, 국가화폐의 경우 대량의 거래를 감당할 수 있는 고성능의 블록체인 기술이 필요하기 때문에 크게 도움이 될 것으로 기대된다.
 
 
 
==평가==
 
 
 
로커스체인은 퍼블릭 블록체인 플랫폼을 목표로 하고 있으며, 대부분의 블록체인에서 사용하는 일자형 블록구조가 아닌 DAG원장구조에서 PoS+BFT합의를 취하고 있다.
 
이로인해 탈중앙화 기반의 확장성과 고성능이 담보되고 있다. 이외에도 네트워크 부하를 줄여주는 다이나믹 샤딩과 원장의 크기를 줄여주는 베리파이어블 프루닝 기술은 한차원 높은 고난이도의 기술로 보인다. 현재 테스트넷이 오픈되어 운영중이다.
 
 
 
 
 
== 관련영상 ==
 
 
 
<youtube width="450">GvsA-zDOFQI</youtube>
 
<youtube width="450">bLvFh5GAQac</youtube>
 
<youtube width="450">-Zjev82LSzU</youtube>
 
<youtube width="450">bzTEj-4p594</youtube>
 
<youtube width="450">lUCMHkGoTg4</youtube>
 
<youtube width="450">K2iXljBPTxc</youtube>
 
<youtube width="450">cUnIacGXC4I</youtube>
 
<youtube width="450">ARPc51UrKqg</youtube>
 
  
 +
[[블록체인]]은 트랜잭션을 [[블록]](Block) 단위의 [[체인]](Chain) 형태로 저장하는 기술이다. 블록체인 상 저장 데이터는 트랜잭션 단위로 생성되게 된다. 트랜잭션은 일반적으로 이전 트랜잭션 출력을 새 트랜잭션 입력으로 참조하고 모든 입력 [[비트코인]](Bitcoin) 값을 새 출력으로 바치는 구조이다. 또한, 트랜잭션은 이중 입력 부기 장부의 연결과 같다. 소유자 [[디지털 서명]]을 사용하여 값을 소비하는 비트코인의 각 금액에 대한 소유권 증명이 포함되어 있으며, 이는 누구든지 독립적으로 확인할 수 있다. 블록은 트랜잭션의 집합을 블록 단위로 기록하며 [[채굴]] 행위를 통해 약 10분(상황에 따라 다름)을 주기로 발행된다. 즉, 블록은 이전 블록의 [[해시 값]](ID)를 포함한다. 블록은 일종의 데이터 패킷으로 위 그림과 같이 몇 가지 정보들을 담고 있다. 가장 중요한 것으로 참여자들이 화폐를 거래한 거래내역, 그리고 이전 블록의 해시 값, [[채굴 난이도]], [[논스]](Nonce) 등이 포함된다. 매 블록은 바로 전 블록의 해시값을 담고 있으며, 이렇게 이어진 블록들은 시간순으로 발생한 이체 내역들을 담고 있는 하나의블록체인을 이룬다.<ref>kimjunyong, 〈[https://medium.com/@kimjunyong/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%9D%98-%EC%A0%95%EC%9D%98%EC%99%80-%EA%B8%B0%EC%88%A0-%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90%EB%8F%84-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-%EA%B8%B0%EB%B3%B8%EC%A0%81-%EC%9D%B4%ED%95%B4-6706ebb43009 블록체인의 정의와 기술 비전공자도 이해하는 기본적 이해]〉, 《미디움》, 2018-11-13</ref>
  
 
{{각주}}
 
{{각주}}
  
 
== 참고자료 ==
 
== 참고자료 ==
 
+
* 데이터베이스 트랜잭션 위키백과 - https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98
* 로커스체인 공식 홈페이지: https://www.locuschain.com 
+
* 마이크로소프트 BEGIN TRANSACTION(Transact-SQL) - https://docs.microsoft.com/ko-kr/sql/t-sql/language-elements/begin-transaction-transact-sql?view=sql-server-ver15
* 로커스체인 백서: https://www.locuschain.com/en/whitepaper
+
* 마이크로소프트 COMMIT TRANSACTION(Transact-SQL) - https://docs.microsoft.com/ko-kr/sql/t-sql/language-elements/commit-transaction-transact-sql?view=sql-server-ver15
* 로커스인사이트: https://www.locuschain.com/en/social
+
* 코딩팩토리, 〈[https://coding-factory.tistory.com/226 (DB기초) 트랜잭션이란 무엇인가?]〉, 《티스토리》, 2018-08-20
* 블룸테크놀로지 공식홈페이지: https://www.bloomtechnology.co.kr
+
* Mommoo, 〈[https://mommoo.tistory.com/62 트랜잭션(Transaction)이란?]〉, 《티스토리》, 2017-02-27
* [https://youtu.be/bLvFh5GAQac 로커스체인 소개 영상]
+
* victolee, 〈[https://victorydntmd.tistory.com/129 (DB이론) 트랜잭션(transaction)과 ACID 특성을 보장하는 방법]〉, 《티스토리》, 2018-02-09
* [https://youtu.be/-Zjev82LSzU 베리파이어블 프루닝 기술 소개 영상]
+
* Lim-Ky, 〈[https://limkydev.tistory.com/100 (DataBase) 트랜잭션이란? (Transaction)]〉, 《티스토리》, 2017-12-12
* [https://youtu.be/bzTEj-4p594 AWTC 원장 구조 및 확장성 관련 영상]
+
* 망나니 개발자, 〈[https://mangkyu.tistory.com/30 (Database) 8. 트랜잭션, 동시성 제어, 회복]〉, 《티스토리》, 2017-10-06
* [https://www.youtube.com/watch?v=cUnIacGXC4I&t=1207s 실용 가능한 고성능 퍼블릭 블록체인…'로커스 체인' 소개 (1부)]
+
* kmmguumnn, 〈[https://starkying.tistory.com/entry/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98Transaction%EC%9D%B4%EB%9E%80 트랜잭션(Transaction)이란?]〉, 《티스토리》, 2019-03-03
* [https://www.youtube.com/watch?v=ARPc51UrKqg&t=7s 실용 가능한 고성능 퍼블릭 블록체인…'로커스 체인' 소개 (2부)]
+
* 쩨리쩨리, 〈[https://jerryjerryjerry.tistory.com/48 (SQL) Transaction(트랜잭션)]〉, 《티스토리》, 2018-04-24
* [https://www.locuschain.com/ko/socialView?blogSeq=186&blogLanguage=ko&blogCategory=movie 로커스체인기술밋업 하이라이트 영상]
+
* jhkang-dev, 〈[https://jhkang-tech.tistory.com/103 (데이터베이스) 트랜잭션], 2018-11-28
* [https://www.locuschain.com/ko/socialView?blogSeq=185&blogLanguage=ko&blogCategory=movie 로커스체인 기술밋업 개발현황 소개 영상]
+
* kimjunyong, [https://medium.com/@kimjunyong/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EC%9D%98-%EC%A0%95%EC%9D%98%EC%99%80-%EA%B8%B0%EC%88%A0-%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90%EB%8F%84-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-%EA%B8%B0%EB%B3%B8%EC%A0%81-%EC%9D%B4%ED%95%B4-6706ebb43009 블록체인의 정의와 기술 비전공자도 이해하는 기본적 이해], 《미디움》, 2018-11-13
* 임영택 기자, 〈[https://www.mk.co.kr/news/it/view/2018/02/136480/ 블록체인 연구개발 전문업체 '블룸테크놀로지' 출범]〉, 《매일경제》, 2018-02-28
 
* 김은지 기자, 〈[http://www.enewstoday.co.kr/news/articleView.html?idxno=1177492 인터뷰-'킹덤언더파이어 신화' 이상윤 "로커스체인, 이더리움 잇는 기술혁신 할 것"]〉, 《이뉴스투데이》, 2018-04-10
 
* 김다운 기자, 〈[http://www.inews24.com/view/1092893 '로커스체인 파운데이션 2018 런칭쇼', 두바이서 성황리 종료]〉, 《아이뉴스24》, 2018-05-04
 
* 〈[https://cointelegraph.com/press-releases/fast-light-and-flexible-the-next-generation-blockchain-platform-locus-chain-has-emerged Fast, Light and flexible, the Next-Generation Blockchain Platform 'Locus Chain' Has Emerged ... !!]〉, 《Cointelegraph》, 2018-06-25
 
* 홍하나 기자, 〈[http://www.ddaily.co.kr/news/article/?no=170420 로커스체인 파운데이션, IES 선정 '2018 우수 글로벌 리더십 어워드' 수상]〉, 《디지털데일리》, 2018-07-06
 
* 방은주 기자, 〈[http://www.zdnet.co.kr/view/?no=20180905220620 로커스체인, 싱가포르서 '역대 최대 월드 서밋' 개최]〉, 《지디넷코리아》, 2018-09-05
 
* 서진욱 기자, 〈[https://news.mt.co.kr/mtview.php?no=2018092009513040421 '블록체인 서울' 성황리 폐막…'블록체인 3.0' 화두 던졌다]〉, 《머니투데이》, 2018-09-20
 
* 여용준 기자, 〈[http://www.enewstoday.co.kr/news/articleView.html?idxno=1273849 로커스체인, 세계 최초 'DAG-BFT 확정 합의 알고리즘' 블록체인 기술 구현 성공]〉, 《이뉴스투데이》, 2019-02-21
 
* 정두용 기자, 〈[http://www.greened.kr/news/articleView.html?idxno=95048 로커스체인-리드텍 '전략적 제휴 계약'…블록체인 기술로 웨어러블 시장 확대 추진]〉, 《녹색경제신문》, 2019-02-26
 
* 노진우 기자, 〈[http://www.wikileaks-kr.org/news/articleView.html?idxno=50945 로커스체인, 국제 스마트시티 엑스포에서 '선도적인 블록체인 기술 기업' 선정돼]〉, 《위키리크스 한국》, 2019-03-22
 
* 류순열 기자, 〈[http://www.upinews.kr/news/newsview.php?ncode=1065599151224065 세계무대서 자신감 드러낸 '로커스체인']〉, 《UPI뉴스》, 2019-04-05
 
* 이상일 기자, 〈[http://www.ddaily.co.kr/news/article/?no=180666 블룸테크놀로지, 로커스체인 밋업행사 성료]〉, 《디지털데일리》, 2019-04-26
 
* 여용준 기자, 〈[http://www.enewstoday.co.kr/news/articleView.html?idxno=1318677 로커스체인, 플랫폼 기술 집약한 엔터프라이즈 메인넷 개발]〉, 《이뉴스투데이》, 2019-07-04
 
* 류순열 기자, 〈[http://www.upinews.kr/news/newsview.php?ncode=1065596656344043 소리 없는 혁명…블록체인과 '소셜벤처'의 만남]〉, 《UPI뉴스》, 2019-07-18
 
* 〈[https://cointelegraph.com/press-releases/locus-chain-harbinger-of-the-credit-revolution Locus Chain, Harbinger of the Credit Revolution]〉, 《Cointelegraph》, 2019-07-25
 
* 유경석 기자, <[http://m.dtoday.co.kr/news/articleView.html?idxno=352580&fbclid=IwAR30zqNTAGkNR_qaLY4bevg5gs5E1aVbYzV22Hn0L2MAwa9ElcEue60EG1g#_enliple 로커스체인, 다이나믹 샤딩 구현…사용량 따라 저장]> , 《일간투데이》, 2020-03-06
 
* 장순관 기자, <[http://www.popsci.co.kr/news/articleView.html?idxno=11425 블룸테크놀로지 '로커스체인' 블록체인 기술의 날개 달다]>, 《파퓰러사이언스》, 2020-03-17
 
* 안재후 기자, <[http://www.fortunekorea.co.kr/news/articleView.html?idxno=12434 포스트 코로나 시대..언택트 경제, 블록체인 주목..블룸테크놀로지 로커스체인]>, <<포춘코리아>> , 2020-05-18
 
* 임민철 기자, <[http://www.upinews.kr/newsView/upi202006160079 "세계 최고 블록체인" 로커스체인, 이달말 공개 테스트]>, <<UPI뉴스>> , 2020-06-16
 
* 박동선 기자, <[https://www.etnews.com/20200617000143 블룸테크놀로지, 이달말 '로커스체인' 공개테스트 예정…'탈중앙-확장' 양립 특성]>, <<전자신문>>, 2020-06-17
 
* 장순관 기자, <[http://www.fortunekorea.co.kr/news/articleView.html?idxno=12638 블룸테크놀로지, 초고성능의 퍼블릭 블록체인 ‘로커스체인’ 테스트넷 글로벌 오픈]>, <<포춘코리아>>, 2020-07-14
 
  
 
== 같이 보기 ==
 
== 같이 보기 ==
 +
* [[데이터베이스]]
 +
* [[블록체인]]
 +
* [[TPS]]
 +
* [[커밋]]
 +
* [[롤백]]
  
* [[블룸테크놀로지]]
+
{{데이터|검토 필요}}
* [[이상윤]]
 
* [[김세정]]
 
* [[확률적지분증명]]
 
* [[DAG]]
 
* [[BFT]]
 
* [[다이내믹 샤딩]]
 
* [[베리파이어블 프루닝]]
 
 
 
{{블록체인 플랫폼}}
 
{{암호화폐 역사}}
 

2022년 12월 19일 (월) 17:38 기준 최신판

트랜잭션(transaction)이란 "쪼갤 수 없는 업무 처리의 최소 단위"를 말한다. 거래내역이라고도 한다. '트렌젝션'이 아니라 '트랜잭션'이 올바른 표기법이다. 영어로 간략히 Tx라고 표기하기도 한다. 1초당 처리할 수 있는 트랜잭션의 개수를 TPS라고 한다.

개요[편집]

트랜잭션은 은행 ATM이나 데이터베이스 등의 시스템에서 사용되는 더 이상 쪼갤 수 없는 업무 처리의 최소 단위이다. 예를 들어, A라는 사람이 B라는 사람에게 1,000원을 지급하고 B가 그 돈을 받은 경우, 이 거래 기록은 더 이상 작게 쪼갤 수가 없는 하나의 트랜잭션을 구성한다. 만약 A는 돈을 지불했으나 B는 돈을 받지 못했다면 그 거래는 성립되지 않는다. 이처럼 A가 돈을 지불하는 행위와 B가 돈을 받는 행위는 별개로 분리될 수 없으며 하나의 거래내역으로 처리되어야 하는 단일 거래이다. 이런 거래의 최소 단위를 트랜잭션이라고 한다. 트랜잭션 처리가 정상적으로 완료된 경우 커밋(commit)을 하고, 오류가 발생할 경우 원래 상태대로 롤백(rollback)을 한다.

목적[편집]

트랜잭션은 데이터베이스 서버에 여러 개의 클라이언트가 동시에 액세스 하거나 응용프로그램이 갱신을 처리하는 과정에서 중단될 수 있는 경우 등 데이터 부정합을 방지하고자 할 때 사용한다.[1] 데이터베이스 기능 중, 트랜잭션을 조작하는 기능은 데이터베이스 완전성(integrity) 유지를 확신하게 한다. 단일 트랜잭션은 데이터베이스 내에 읽거나 쓰는 여러 개 쿼리를 요구한다. 이때 중요한 것은 데이터베이스가 수행된 일부 쿼리가 남지 않는 것이다. 예를 들어, 송금을 할 때 한 계좌에서 인출되면 다른 계좌에서 입금이 확인되는 것이 중요하다. 또한 트랜잭션은 서로 간섭하지 않아야 한다. 만약 쿼리 하나가 실패하면, 데이터베이스 시스템은 전체 트랜잭션 또는 실패한 쿼리를 롤백 한다. 이것은 DBMS가 어떻게 사용되고 셋업 되었느냐에 따라 다르다. 트랜잭션은 커밋전에 언제든지 수동으로 롤백 될 수 있다. 간단한 트랜잭션의 경우 아래 양식의 SQL 언어로 데이터베이스 내에서 실행된다.[2]

  • Begin the transaction[3]
--Applies to SQL Server and Azure SQL Database

BEGIN { TRAN | TRANSACTION }   
   [ { transaction_name | @tran_name_variable }  
     [ WITH MARK [ 'description' ] ]  
   ]  
[ ; ] 
--Applies to Azure SQL Data Warehouse and Parallel Data Warehouse

BEGIN { TRAN | TRANSACTION }   
[ ; ]   
  • Execute several queries(DB내 갱신이 아직 적용되지 않는다.)
  • Commit the transaction(트랜잭션이 성공적이며, 갱신이 실제 적용됨.)[4]
-- Applies to SQL Server (starting with 2008) and Azure SQL Database
 
COMMIT [ { TRAN | TRANSACTION }  [ transaction_name | @tran_name_variable ] ] [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]  
[ ; ]  
-- Applies to Azure SQL Data Warehouse and Parallel Data Warehouse Database
 
COMMIT [ TRAN | TRANSACTION ] 
[ ; ]  

조건[편집]

트랜잭션은 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적인 단위로 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업 단위이다. 하나의 트랜잭션은 커밋(commit) 되거나 롤백이 된다.[5] 데이터베이스의 트랜잭션이 안전하게 수행되기 위해서는 ACID 조건을 충족해야 한다. ACID란 Atomicity(원자성), Consistency(일관성), Isolation(고립성), Durability(지속성)의 약자로서, 데이터베이스의 트랜잭션이 안전하게 수행되기 위한 4가지 필수적인 성질을 말한다.

원자성[편집]

원자성(atomicity)은 하나의 트랜잭션이 더 이상 작게 쪼갤 수 없는 최소한의 업무 단위이다. 트랜잭션이 데이터베이스에 모두 반영되던지, 아니면 전혀 반영되지 않아야 하며 작업이 부분적으로 실행되거나 중단되지 않는 것을 보장하는 것으로 즉, All or Nothing의 개념으로서 작업 단위를 일부분만 실행하지 않는다는 것을 의미한다. 트랜잭션 실행 도중 문제가 발생했을 경우 중단된 상태가 아닌 모두 실패하거나, 모두 완성되거나 둘 중 하나의 상태가 되어야 한다. 즉, 100개 명령어로 구성된 트랜잭션 중 99개 완료 1개 실패가 된다면, 이는 무조건 실패로 간주하여 트랜잭션 시작 전 상태로 돌려야 한다. 또한 100개가 모두 성공했을 시 트랜잭션은 성공이기 때문에 중간 상태가 없다. 트랜잭션은 사람이 설계한 논리적인 작업 단위이기 때문에 일처리가 작업 단위 별로 이루어져야 사람이 다루는데 무리가 없다. 만약 트랜잭션 단위로 데이터가 처리되지 않는다면, 설계한 사람은 데이터 처리 시스템을 이해하기 힘들 뿐만 아니라, 오작동 했을 시 원인을 찾기가 매우 힘들어진다. 트랜잭션 내의 모든 명령은 반드시 완벽하게 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느 하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다. 트랜잭션이 원자성이라는 성질을 지니게 된 이유는 중간에 끊기게 되면 이후 해당 트랜잭션의 어디서부터 이어서 수행되어야 하는지 모르기 때문이다.[1][5][6][7][8]

  • 원자성 보장 : 트랜잭션에서 원자성은 수행하고 있는 트랜잭션에 의해 변경된 내역을 유지하면서, 이전에 커밋된 상태를 임시 영역에 따로 저장함으로써 보장한다. 즉, 현재 수행하고 있는 트랜잭션에서 오류가 발생하면 현재 내역을 날려버리고 임시 영역에 저장했던 상태로 롤백 한다. 이전 데이터들이 임시로 저장되는 영역을 롤백 세그먼트(rollback segment)라고 하며, 현재 수행하고 있는 트랜잭션에 의해 새롭게 변경되는 내역을 데이터베이스 테이블이라고 한다. 다시 말해, 트랜잭션의 원자성은 롤백 세그먼트에 의해 보장된다고 할 수 있다. 그런데 오류가 발생하면 롤백 하는데, 트랜잭션의 길이가 길어지게 되면 확실하게 오류가 발생하지 않는 부분도 다시 처음부터 작업을 수행해야 한다. 따라서 확실한 부분에 대해서는 롤백이 되지 않도록 중간 저장 지점인 세이브포인트(save point)를 지정할 수 있다. 세이브포인트를 지정하게 되면 롤백 할 때 세이브포인트 이전은 확실하다 간주하고 그 이후부터 진행하게 된다.[1]

일관성[편집]

일관성(consistency)은 트랜잭션이 완료된 결괏값이 일관적인 DB 상태를 유지하는 것을 말한다. 시스템이 가지고 있는 고정요소는 수행 전과 후의 상태가 같아야 하며 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것으로 트랜잭션이 진행되는 동안 데이터베이스가 변경되더라도 업데이트된 데이터베이스로 트랜잭션이 진행되는 것이 아니라, 처음 트랜잭션을 진행하기 위해 참조한 데이터베이스로 진행된다. 이렇게 함으로써 각 사용자가 일관성 있는 데이터를 볼 수 있는 것이다. 트랜잭션 수행 전후의 데이터베이스 상태는 각각 일관성이 보장되는 서로 다른 상태가 된다. 트랜잭션 수행이 보존해야 할 일관성은 기본 키, 외래 키 제약과 같은 명시적인 무결성 제약 조건들뿐만 아니라, A에서 B로 돈을 이체할 때 A와 B 계좌의 돈의 총합이 같아야 한다는 사항과 같은 비명시적인 일관성 조건들도 있다.[1][5][6][7][8][9]

  • 일관성 보장 : 트랜잭션에서 일관성은 트랜잭션 수행 전/후에 데이터 모델의 모든 제약 조건(기본 키, 외래 키, 도메인, 도메인 제약조건 등)을 만족하는 것을 통해 보장한다. 예를 들어 Movie와 Video 테이블이 있을 때 Video 테이블의 기본 키(primary key)인 movie_id가 외래키로 존재한다고 가정한다. 만약 movie_id의 제약 조건이 Movie 테이블에서 변경되면, Video 테이블에서도 movie_id가 변경되어야 한다. 한 쪽의 테이블에서만 데이터 변경사항이 이루어져서는 안되는 것이다. 이때 트랜잭션의 일관성을 보장하기 위한 방법은 어떤 이벤트와 조건이 발생했을 때, 트리거(Trigger)를 통해 보장하는 것이다. 트리거는 '방아쇠'라는 뜻인데, 데이터베이스 시스템이 자동적으로 수행할 동작을 명시할 때 사용된다. 즉, 어떤 행위의 시작을 알리는 것이다.[1]

고립성[편집]

고립성(isolation)이란 하나의 트랜잭션 수행시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장하는 것이다. 즉, 트랜잭션 끼리는 서로를 간섭할 수 없다. 트랜잭션이 실행하는 도중에 변경한 데이터는 이 트랜잭션이 완료될 때까지 다른 트랜잭션이 참조하지 못하게 하는 특성이다. 데이터베이스는 클라이언트들이 같은 데이터를 공유하는 것이 목적이므로 여러 트랜잭션이 동시에 수행되어야 한다. 이때 트랜잭션은 상호 간의 존재를 모르고 독립적으로 수행되어야 한다. 고립성은 격리성이라고도 하는데 이를 유지하기 위해서는 여러 트랜잭션이 동시에 접근하는 데이터에 대한 제어가 필요하다. 여러 트랜잭션이 동시에 수행되더라도 각각의 트랜잭션은 다른 트랜잭션의 수행에 영향을 받지 않고 독립적으로 수행되어야 한다. 한 트랜잭션에서 데이터베이스를 변경한 내용은 트랜잭션이 커밋되기 전까지는 다른 어떤 질의나 트랜잭션과도 고립되어야만 한다. 즉, 각 트랜잭션은 시스템 내에서 동시에 수행되고 있는 다른 트랜잭션들을 알지 못하는 것이다. 한 트랜잭션의 중간 결과가 다른 트랜잭션에게는 숨겨져야 한다는 의미인데, 이러한 성질이 보장되지 않으면 트랜잭션이 원래 상태로 되돌아갈 수 없게 된다. DBMS의 병행 제어 모듈이 트랜잭션의 고립성을 보장하며 예를 들어 설명하자면 하나의 트랜잭션이 A라는 계좌에서 작업을 하고 있을 경우 다른 트랜잭션이 A계좌에 대해 참조하거나 관여할 수 없고 작업이 끝날 때까지 대기해야 하는 것을 말한다.[1][7][8][9]

  • 고립성 보장 : 병행처리 과정에서 트랜잭션의 고립성이 왜 보장되어야 하는지 알 수 있다. OS의 세마포어(semaphore)와 비슷한 개념으로 lock&excute unlock을 통해 고립성을 보장할 수 있었다. 즉, 데이터를 거나 쓸 때는 문을 잠궈서 다른 트랜잭션이 접근하지 못하도록 고립성을 보장하고, 수행을 마치면 언락(unlock)을 통해 데이터를 다른 트랜잭션이 접근할 수 있도록 허용하는 방식이다. 트랜잭션에서는 데이터를 읽을 때, 여러 트랜잭션이 읽을 수는 있도록 허용하는 공유 록(shared_lock)을 한다. 즉, 공유 록은 데이터 쓰기를 허용하지 않고 오직 읽기만 허용하는 것이다. 또한 데이터를 쓸 때는 다른 트랜잭션이 읽을 수도 쓸 수도 없도록 하는 배타 록(exclusive_lock)을 사용한다. 그리고 읽기, 쓰기 작업이 끝나면 언락을 통해 다른 트랜잭션이 록(lock)을 할 수 있도록 데이터에 대한 잠금을 풀어준다. 단, 록(lock)과 언락을 잘못 사용하면 데드락(deadlock)상태에 빠질 수 있다. 즉, 모든 트랜잭션이 아무것도 수행할 수 없는 상태가 되는 것이다.[1]

지속성[편집]

트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야 한다. 지속성(durability)은 트랜잭션의 성공 결과 값은 장애 발생 후에도 변함없이 보관되어야 한다는 것으로 트랜잭션이 정상적으로 완료된 경우에는 버퍼의 내용을 하드디스크(데이터베이스)에 확실히 기록해야 하며, 부분 완료(Partial Commit)된 경우에는 작업을 취소(Aborted)하여야 한다 즉, 정상적으로 완료 혹은 부분 완료된 데이터는 DBMS가 책임지고 데이터베이스에 기록하는 성질이 지속성이며 영속성이라고 표현하기도 한다. [7][8][9]

특징[편집]

무정지성[편집]

트랜잭션 기능의 대표적인 이점 중 하나는 무정지성의 향상이다. 즉, 운영체제 장애 등의 서버 장애가 발생하여 그로부터 데이터베이스를 재가동한 때에 '장애 직전까지의 커밋 결과를 손실하지 않고 마치는 것'이 가능하다. 트랜잭션을 지원하지 않는 데이터베이스의 경우 OS 장애뿐만 아니라 데이터베이스 프로세스가 비정상적으로 종료하기만 해도 데이터베이스가 손상될 수 있다. 깨진 데이터베이스를 복구하려고 해도 일부 데이터가 없어지거나 완전히 복구되지 않는 등 완전한 회복이 불가능한 경우도 많다. 오라클(Oracle)과 InnoDB 같은 트랜잭션 대응의 데이터베이스에서는 이러한 문제가 발생하지 않는데, REDO 로그(데이터베이스에서 수행한 작업을 다시 실행하는 로그)를 이용한 아키텍처로 무정지성을 보장하고 있기 때문이다.

  • REDO 로그 : 열 값과 인덱스를 갖는 데이터 파일에는 커밋을 할 때마다 기록을 하는 것이 아니라 캐시 영역에 보관해 두고 정기적으로 디스크에 기록하는 동작을 하는데 REDO 로그 파일이 최신 커밋 정보를 가지고 있는 반면, 본체의 데이터 파일은 오래된 데이터를 가지고 있게 된다. 그래도 캐시 영역에 최신 데이터가 있기 때문에 데이터 파일에 이전 데이터밖에 없더라도 애플리케이션에서 보면 최신 데이터를 읽고 쓸 수 있어 모순된 상태가 되지는 않는다. 서버 장애 등의 이유로 데이터베이스가 멈춰서 재기동을 하게 되는 경우 데이터 파일이 이전 데이터밖에 남지 않았을 때 REDO 로그의 내용을 데이터 파일에 적용시켜 나감으로써 데이터 파일과 REDO 로그의 LSN과 일치시키는 작업을 수행한다. 이 과정을 충돌 복구(Clash Recovery)라고 한다.

과정[편집]

트랜잭션의 필요성
트랜잭션의 상태
커밋(commit)
롤백(rollback)

트랜잭션은 거래의 안전성을 확보하는 방법이다. A 은행에서 B 은행으로 송금을 하다가 송금 도중 알 수 없는 오류가 발생하여 A 은행 계좌에서 돈이 빠져 나갔는데 B 은행 계좌에 입금되지 않았다. 이때, A 은행 계좌의 출금을 취소하거나 출금된 금액만큼 B 은행 계좌로 다시 송금하면 된다. 하지만 이러한 방법은 번거롭고 더 심한 오류를 발생시킬 수 있다. 이때 거래가 성공적으로 모두 끝난 후에야 이를 완전한 거래로 승인하고, 거래 도중 오류가 발생했을 때는 이 거래를 아예 처음부터 없었던 거래로 되돌려 이러한 문제를 예방할 수 있다.

이렇게 거래의 안전성을 확보하는 방법이 바로 트랜잭션이다. 데이터베이스에서는 테이블에서 데이터를 읽어온 후 다른 테이블에 데이터를 입력하거나 갱신, 삭제하는 데 처리 도중 오류가 발생하면 모든 작업을 원상태로 되돌린다. 데이터베이스에서는 처리 과정이 모두 성공했을 때만 최종적으로 데이터베이스에 반영한다. 1, 2번까지 잘 실행되다가 3번 작업 시 소프트웨어가 중단되거나 하드웨어 고장이 발생해 작업에 오류가 생기게 된다면 2번까지의 모든 작업을 취소하고 트랜잭션 작업 전인 데이터베이스 초기 상태로 돌아가게 된다.[10]

상태[편집]

트랜잭션에는 사용자가 적은 쿼리문과 데이터를 최종적으로 데이터베이스에 반영하는 커밋과 실패했을 때 시점으로 다시 되돌아가는 롤백이 있다.

  • 활동(Active) : 트랜잭션이 실행 중인 상태이다.
  • 실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태이다.
  • 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 롤백 연산을 수행한 상태이다.
  • 부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, 커밋 연산이 실행되기 직전의 상태이다.
  • 완료(Committed) : 트랜잭션이 성공적으로 종료되어 커밋 연산을 실행한 후의 상태이다.[5]

연산[편집]

커밋[편집]

커밋(commit) 연산은 모든 작업들을 정상적으로 처리하겠다고 확정하는 명령어로서, 처리과정을 데이터베이스에 영구적으로 저장하는 것이다. 커밋을 수행하면 하나의 트랜잭션 과정을 종료하는 것이다. 커밋을 수행하면 이전 데이터가 완전히 업데이트된다.[5] 우측 그림에서 첫 번째 커밋 후 그 뒤에 Update 문으로 데이터를 갱신하고 Delete 문으로 데이터를 삭제한 후 Insert 문을 사용해 데이터를 삽입한다. 만약 이 모든 과정이 오류 없이 수행되었다면 지금까지 실행한 모든 작업을 데이터베이스에 영구 저장하라는 명령으로 커밋을 수행한다.[10]

롤백[편집]

롤백(rollback) 연산은 작업 중 문제가 발생하여 트랜잭션의 처리과정에서 발생한 변경사항을 취소하는 명령어이다. 이 트랜잭션의 일부가 정상적으로 처리되더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소한다는 특징이 있다. 트랜잭션이 시작되기 이전의 상태로 되돌린다. 즉, 마지막 커밋을 완료한 시점으로 다시 돌아간다. 커밋하여 저장한 것만 복구한다. 롤백 시에는 해당 트랜잭션을 재시작하거나 폐기한다.[5] 우측 그림에서 롤백 명령은 마지막으로 수행한 커밋 명령까지만 정상 처리된 상태로 유지한다. 그 이후에 수행했던 모든 DML 명령어 작업들을 취소시켜 이전 상태로 원상 복귀 시킨다. 트랜잭션은 이렇듯 all or nothing(모든 것을 수행하던지 아무것도 하지 말던지) 방식으로 DML 명령어들을 처리한다.[10]

세이브포인트[편집]

세이브포인트(save point)는 '임시저장' 또는 '부분저장'과 같은 맥락으로 이해할 수 있다. 보통 롤백을 명시하면 삽입, 삭제, 업데이트 등의 작업 전체가 취소되는데, 세이브포인트는 전체가 아닌 특정 부분에서 트랜잭션을 취소하기 위해 사용한다. 세이브포인트를 쓰면 현재의 트랜잭션을 작게 분할하는 것이 가능하다. 세이브포인트는 여러 개의 에스큐엘(SQL)문의 실행을 수행하는 트랜잭션의 경우에 사용자가 트랜잭션 중간 단계에서 세이브포인트를 지정할 수 있다. 세이브포인트를 쓰려면 취소하려는 지점을 명시한 뒤, 그 지점까지 작업을 취소하는 식으로 사용하는데 이 지점을 세이브포인트라고 한다. 세이브포인트를 지정한 뒤 롤백 투 세이브포인트 이름;(rollback to save point name;)을 실행하면 해당 세이브포인트 지점까지 처리한 직업이 롤백된다.

스케줄 종류[편집]

직렬 스케줄[편집]

직렬 스케줄(Serial schedule)은 순서대로, 하나씩 트랜잭션을 실행하는 것으로 트랜잭션 하나의 실행이 완료되면 다른 트랜잭션을 시작하는 방식으로 하나씩 차례대로 실행하는 스케줄로서 트랜잭션이 실행되는 동안 다른 트랜잭션의 영향을 받을 수 없으므로 모순이 발생하지 않는다.[11]

직렬화 스케줄[편집]

직렬화 스케줄(Serializable schedule)은 병행 제어, 직렬 스케줄 장점을 가진 것으로 트랜잭션들이 동시에 자료 접근 연산들을 교차하며 실행시키면서도 결과가 직렬 스케줄과 동일한 스케줄이다. 즉, 병행 처리하지만 적절한 제어 조치를 취함으로써 일관성을 유지하는 스케줄로서 병행 제어에서 필요한 스케줄이다. 즉, 병행 제어 스케줄은 직렬성을 유지할 수 있다. 직렬성이란 트랜잭션들의 처리 결과가 직렬 처리와 동일한 효과를 가지는 스케줄 특성이다.[11]

병행처리[편집]

다수의 사용자가 데이터베이스에 요청을 보내게 되면 이러한 요청들을 처리할 방법이 필요하다. 만약 하나의 요청을 끝내고 다른 요청을 수행하는 방식이라면 처리시간이 매우 오래 걸린다. 그래서 병행처리 방식으로 처리를 한다. 트랜잭션을 병행처리하면 처리 효율이 높아지지만, 처리 과정에서 동일한 자료를 동시에 접근해서 오류가 생길 수 있다.

병행처리의 문제점
종류 내역 문제점
갱신 유실 문제 두 트랜잭션이 동시에 동일한 자료를 갱신 첫째 갱신이 유실
오류 읽기 문제 갱신하는 도중에 다른 트랜잭션이 읽기 낡은 자료 읽기
잘못된 요약 두 자료를 갱신하는 도중에 읽기 요약 결과 오류
무결성 제약조건 두 자료의 제약조건을 검사하지 않고 갱신 일관성 위반

따라서 병행제어가 필요한데, 병행제어가 필요한 이유는 다음과 같다.

  • 분실된 업데이트 문제(The Lost Update Problem) : 두 개의 트랜잭션이 동일한 아이템에 접근하여 서로의 연산이 중첩될 때 결과적으로 올바르지 않은 값이 저장될 수 있다.
  • 임시 업데이트 문제(The Temporary Update Problem) : 한 트랜잭션이 값을 업데이트하다가 중간에 트랜잭션이 실패하였다. 하지만 롤백하기 이전에 다른 트랜잭션이 값을 읽게 되면 올바르지 않은 값을 읽는 것이다.
  • 잘못된 요약 문제(The Incorrect Summary Problem) : 한 트랜잭션이 aggregate 함수(Sum, Max, Min 등)를 실행하고 있는데, 다른 트랜잭션이 이 값들 중 하나를 업데이트하고 있을 때 aggregate 트랜잭션의 값이 업데이트되기 이전을 사용할 때이다.

데이터베이스 병행처리의 목적은 1) 트랜잭션의 충돌을 방지하기 위해 고립성을 강제하기 위함, 2) 데이터베이스의 일관성을 보존하기 위함, 3) read-write 또는 write-write 충돌을 막기 위함의 세 가지로서, 스케줄의 진정한 목적은 충돌 스케줄을 찾아 직렬화 스케줄을 만드는 것이다.[11]

록킹[편집]

트랜잭션이 자료를 배타적으로 접근할 수 있으면 그 트랜잭션이 완료된 후에 다른 트랜잭션이 실행되기 때문에 직렬성이 확보된다. 자료를 배타적으로 접근하는 방법이 바로 록킹 기법이다. 트랜잭션의 ACID 특성을 해치는 접근 연산은 주로 갱신이다. 읽기 연산은 자료 값을 바꾸지 않는다. 하지만 읽기 연산 도중에 갱신을 하게되면 일관성 유지가 어려울 수 있다. 트랜잭션에는 공유 록과 배타 록 2가지가 있다.

  • 공유 록 : 특정 자료 Q에 공유 록을 걸면 다른 트랜잭션이 이 자료를 갱신할 수 없다. 공유 록(Shared Lock)이 걸린 Q는 다른 트랜잭션에 의해서 읽혀질 수 있다.[11]
  • 배타 록 : 트랜잭션이 자료를 기록할 때 배타 록(Exclusive Lock) X를 걸어야 한다. 록 X를 가진 트랜잭션은 자료를 읽을 수도 있고, 갱신할 수도 있다. 배타 록 X가 걸린 자료는 공유 록 S를 가진 트랜잭션들에 의해서 읽혀질 수 없는데 더디리드(Dirty Read)를 방지하기 위해서이다.[11]

복제[편집]

복제 구성에서 있어서 슬레이브에서는 마스터에서 전송되어 온 업데이트성 쿼리를 실행하는 역할을 한다. 이 처리는 사실 업데이트성 쿼리를 실행하는 것만으로는 충분하지 않고 슬레이브는 마스터에서 보낸 업데이트성 쿼리 중에서 어디까지를 실행했는지라는 정보도 관리할 필요가 있다. 그렇게 처리하지 않으면 도중에 슬레이브가 멈추었을 경우 어디서부터 다시 시작하면 좋을지 알 수 없기 때문이다. 엄밀하게는 이 정보원들은 동일한 트랜잭션에서 원자성 있게 갱신해야 한다. 마이에스큐엘(MySQL)에서는 마스터가 트랜잭션이 커밋될 때마다 그 생신 에스큐엘(SQL) 문을 바이너리 로그에 기록할 때, 슬레이브에서는 바이너리 로그의 내용을 싫어하여 나가지만, 현재 어디까지 실행했는지를 관리하기 위해 실행을 마친 바이너리 로그의 위치 정보를 관리하는 InnoDB 테이블을 제공한다. 그리고 갱신 에스큐엘 문의 실행과 위치 정보 갱신을 동일한 트랜잭션에서 실시한다. 애플리케이션의 관점에서 모든 업데이트성 쿼리가 UPDATE 문 한 번밖에 없는 자동 커밋 쿼리라 할지라도 복제 구성과 조합한 시점에서 업데이트성 쿼리의 실행에 더하여 복제 상태 업데이트 처리도 모두 한 개의 트랜잭션으로 하지 않으면 안된다. 이것들이 하나의 트랜잭션으로 되어 있으면 어느 타이밍에 크래쉬해도 갱신 확정된 쿼리를 또다시 복제하거나, 반대로 복제를 날려 버리는 일은 없게 될 것이다.

블록체인[편집]

블록체인에서의 트랜잭션

블록체인은 트랜잭션을 블록(Block) 단위의 체인(Chain) 형태로 저장하는 기술이다. 블록체인 상 저장 데이터는 트랜잭션 단위로 생성되게 된다. 트랜잭션은 일반적으로 이전 트랜잭션 출력을 새 트랜잭션 입력으로 참조하고 모든 입력 비트코인(Bitcoin) 값을 새 출력으로 바치는 구조이다. 또한, 트랜잭션은 이중 입력 부기 장부의 연결과 같다. 소유자 디지털 서명을 사용하여 값을 소비하는 비트코인의 각 금액에 대한 소유권 증명이 포함되어 있으며, 이는 누구든지 독립적으로 확인할 수 있다. 블록은 트랜잭션의 집합을 블록 단위로 기록하며 채굴 행위를 통해 약 10분(상황에 따라 다름)을 주기로 발행된다. 즉, 블록은 이전 블록의 해시 값(ID)를 포함한다. 블록은 일종의 데이터 패킷으로 위 그림과 같이 몇 가지 정보들을 담고 있다. 가장 중요한 것으로 참여자들이 화폐를 거래한 거래내역, 그리고 이전 블록의 해시 값, 채굴 난이도, 논스(Nonce) 등이 포함된다. 매 블록은 바로 전 블록의 해시값을 담고 있으며, 이렇게 이어진 블록들은 시간순으로 발생한 이체 내역들을 담고 있는 하나의블록체인을 이룬다.[12]

각주[편집]

  1. 1.0 1.1 1.2 1.3 1.4 1.5 1.6 victolee, 〈(DB이론) 트랜잭션(transaction)과 ACID 특성을 보장하는 방법〉, 《티스토리》, 2018-02-09
  2. 데이터베이스 트랜잭션 위키백과 - https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98
  3. BEGIN TRANSACTION(Transact-SQL)〉, 《마이크로소프트》, 2016-06-10
  4. COMMIT TRANSACTION(Transact-SQL)〉, 2016-09-09
  5. 5.0 5.1 5.2 5.3 5.4 5.5 코딩팩토리, 〈(DB기초) 트랜잭션이란 무엇인가?〉, 《티스토리》, 2018-08-20
  6. 6.0 6.1 Mommoo, 〈트랜잭션(Transaction)이란?〉, 《티스토리》, 2017-02-27
  7. 7.0 7.1 7.2 7.3 Lim-Ky, 〈(DataBase) 트랜잭션이란? (Transaction)〉, 《티스토리》, 2017-10-06
  8. 8.0 8.1 8.2 8.3 망나니 개발자, 〈(Database) 8. 트랜잭션, 동시성 제어, 회복〉, 《티스토리》, 2017-12-12
  9. 9.0 9.1 9.2 kmmguumnn, 〈트랜잭션(Transaction)이란?〉, 《티스토리》, 2019-03-03
  10. 10.0 10.1 10.2 쩨리쩨리, 〈(SQL) Transaction(트랜잭션)〉, 《티스토리》, 2018-04-24
  11. 11.0 11.1 11.2 11.3 11.4 jhkang-dev, 〈(데이터베이스) 트랜잭션〉, 《티스토리》, 2018-11-28
  12. kimjunyong, 〈블록체인의 정의와 기술 비전공자도 이해하는 기본적 이해〉, 《미디움》, 2018-11-13

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 트랜잭션 문서는 데이터에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.