UPDATE 트랜잭션에 의한 테이블 잠금 확인 및 조치

마지막 업데이트: 2022년 4월 6일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기

트랜잭션 프로세서

1. 트랜잭션( transaction )

트랜잭션이란 질의(query)를 하나의 묶음 처리해서 만약 중간에 실행이 중단됐을 경우,

처음부터 다시 실행하는 Rollback을 수행하고, 오류없이 실행을 마치면 commit을 하는 실행 단위를 의미합니다.

즉, 한 번 질의가 실행되면 질의가 모두 수행되거나 모두 수행되지 않는 작업수행의 논리적 단위입니다.

예를 들어, 친구에게 인터넷 뱅킹으로 10,000원을 송금하는 상황을 가정해보겠습니다.

제가 친구에게 송금을 한다면, 저의 계좌에서 10,000원을 차감하고 친구의 계좌에 10,000원을 증가시켜야 하는데,

알 수 없는 오류로 인해 저의 계좌에서는 10,000원이 줄었지만 친구 계좌에는 10,000원이 증가되지 않는다면 어떻게 될까요?

저의 10,000원은 그냥 공중으로 증발해버리는 문제가 발생합니다.

이러한 경우가 생기지 않도록 중간에 오류가 발생하면 다시 처음부터 송금을 하도록 하는 것이 rollback입니다.

오류 없이 정상적으로 송금이 됐다면 UPDATE 트랜잭션에 의한 테이블 잠금 확인 및 조치 정상적으로 실행이 끝났으므로 commit을 합니다.

즉, 송금 과정을 하나의 트랜잭션이라 볼 수 있습니다.

참고로 트랜잭션을 작업수행의 논리적 단위라고 했는데요, 때문에 DBMS의 성능은 초당 트랜잭션의 실행 수( TPS : Transaction per second )로 측정합니다.

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

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

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

트랜잭션에서 중요한 것은 스케줄 관리입니다.

스케줄을 잘못 짜게 되면, 데드락에 빠지게 되는데 이와 관련된 주제가 뒤에서 살펴볼 2PL입니다.

트랜잭션에는 아래와 같이 4가지의 특성이 있습니다.

4가지 특성의 앞 글자만 따서 ACID 특성이라 하며, 면접질문 및 정보처리기사 등의 시험에서 자주 등장하는 개념입니다.

  • 원자성 ( Atomicity )
    • 트랜잭션의 작업이 부분적으로 실행되거나 중단되지 않는 것을 UPDATE 트랜잭션에 의한 테이블 잠금 확인 및 조치 보장하는 것을 말합니다.
    • 즉, All or Noting의 개념으로서 작업 단위를 일부분만 실행하지 않는다는 것을 의미합니다.

    일관성 ( Consistency )

    트랜잭션이 성공적으로 완료되면 일관적인 DB상태를 유지하는 것을 말합니다.

    여기서 말하는 일관성이란, 위의 송금 예제에서 금액의 데이터 타입이 정수형(integer)인데, 갑자기 문자열(string)이 되지 않는 것을 말합니다.

    즉, 송금 전후 모두 금액의 데이터 타입은 정수형이여야 한다는 것이 일관성입니다.

    격리성 ( Isolation )

    트랜잭션 수행시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장하는 UPDATE 트랜잭션에 의한 테이블 잠금 확인 및 조치 것을 말합니다.

    즉, 트랜잭션끼리는 서로를 간섭할 수 없습니다.

    지속성 ( Durability )

    성공적으로 수행된 트랜잭션은 영원히 반영이 되는 것을 말합니다.

    commit을 하면 현재 상태는 영원히 보장됩니다.

    이제부터 트랜잭션이 각 특성들을 어떻게 보장하고 있는지 알아보도록 하겠습니다.

    트랜잭션에서 원자성은 수행하고 있는 트랜잭션에 의해 변경된 내역을 유지하면서, 이전에 commit된 상태를 임시 영역에 따로 저장함으로써 보장합니다.

    즉, 현재 수행하고 있는 트랜잭션에서 오류가 발생하면 현재 내역을 날려버리고 임시 영역에 저장했던 상태로 rollback 합니다.

    이전 데이터들이 임시로 저장되는 영역을 롤백 세그먼트(rollback segment)라고 하며,

    현재 수행하고 있는 트랜잭션에 의해 새롭게 변경되는 내역을 테이터베이스 테이블이라고 합니다.

    다시 말하면, 트랜잭션의 원자성은 롤백 세그먼트에 의해 보장된다고 할 수 있습니다.

    그런데 오류가 발생하면 rollback을 하는데, 트랜잭션의 길이가 길어지면 어떻게 될까요?

    확실하게 오류가 발생하지 않는 부분도 다시 처음부터 작업을 수행해야 합니다.

    따라서 확실한 부분에 대해서는 rollback이 되지 않도록 중간 저장 지점인 save point를 지정할 수 있습니다.

    save point를 지정하면 rollback 할 때 save point 이전은 확실하다 간주하고 그 이후부터 진행하게 됩니다.

    트랜잭션에서 일관성은 트랜잭션 수행 전, 후에 데이터 모델의 모든 제약 조건(기본키, 외래키, 도메인, 도메인 제약조건 등)을 만족하는 것을 통해 보장합니다.

    예를 들어, Movie와 Video 테이블이 있을 때 Video 테이블에 Movie 테이블의 primary key인 movie_id 가 외래키로 존재한다고 가정하겠습니다.

    만약 movie_id 의 제약조건이 Movie 테이블에서 변경되면, Video 테이블에서도 movie_id 가 변경되어야 합니다.

    한 쪽의 테이블에만 데이터 변경사항이 이루어지면 안되는 것이죠.

    그렇다면 어떻게 트랜잭션은 일관성을 보장할까요?

    어떤 이벤트조건이 발생했을 때, 트리거( Trigger )를 통해 보장합니다.

    트리거는 "방아쇠"인데, 데이터베이스 시스템이 자동적으로 수행할 동작을 명시하는데 사용됩니다.

    어떤 행위의 시작을 알리는 것이죠.

    위의 코드는 트리거가 호출되면, 수행할 질의들을 트리거로 생성해서 작성한 코드입니다.

    create 는 트리거를 생성하는 코드이고, after 는 트리거가 실행되기 위한 event를 나타냅니다.

    트랜잭션이 고립성을 보장하는 방법에 대해 이해하기 위해서는 병행 트랜잭션에 대해 먼저 알아야 합니다.

    1) 병행 처리 ( concurrent processing )

    CPU가 여러 프로세스를 처리하는 것처럼, 트랜잭션에 정해진 시간을 할당해서 작업을 하다가 부여된 시간이 끝나면 다른 트랜잭션을 실행하는 이런 방식으로 트랜잭션들을 조금씩 처리하는 것을 말합니다.

    그런데 이렇게 되면 많은 트랜잭션들이 조금씩 처리되는 과정에서 공통된 데이터를 조작하게 되는데, 이 경우 데이터가 혼란스러워 질 수 있습니다.

    예를 들어, A 트랜잭션에서 x라는 데이터를 100으로 설정한 후 시간이 만료되어 B 트랜잭션으로 넘어갔다고 가정해보겠습니다.

    B 트랜잭션에서는 x 데이터에 -50 연산을 해서 저장을 했을때, 시간이 만료되어 다시 A 트랜잭션이 실행될 경우 x 데이터의 값은 50이 됩니다.

    이렇게 트랜잭션이 조금씩 수행될 때, 공통된 데이터가 다른 트랜잭션에 의해 방해되면 안됩니다.

    이와 같이 트랜잭션의 간섭이 일어날 경우 갱신분실, 오손판독, 반복불가능, 팬텀문제 등 여러 문제점들이 발생합니다.

    병행처리 과정에서 트랜잭션의 고립성이 왜 보장되어야 하는지를 알게되었습니다.

    그러면 고립성을 어떻게 보장할 수 있을까요?

    OS의 세마포어(semaphore)와 비슷한 개념으로 lock & excute unlock을 통해 고립성을 보장할 수 있습니다.

    즉, 데이터를 읽거나 쓸 때는 문을 잠궈서 다른 트랜잭션이 접근하지 못하도록 고립성을 보장하고, 수행을 마치면 unlock을 통해 데이터를 다른 트랜잭션이 접근할 수 있도록 허용하는 방식입니다.

    트랜잭션에서는 데이터를 읽을 때, 여러 트랜잭션이 읽을 수는 있도록 허용하는 shared_lock을 합니다.

    즉, shared_lock은 데이터 쓰기를 허용하지 않고 오직 읽기만 허용합니다.

    또한 데이터를 쓸 때는 다른 트랜잭션이 읽을 수도 쓸 수도 없도록 하는 exclusive_lock을 사용합니다.

    그리고 읽기, 쓰기 작업이 끝나면 unlock을 통해 다른 트랜잭션이 lock을 할 수 있도록 데이터에 대한 잠금(lock)을 풀어줍니다.

    그런데 lock과 unlock을 잘못 사용하면 데드락(deadlock)상태에 빠질 수 있습니다.

    모든 트랜잭션이 아무것도 수행할 수 없는 상태가 되는 것이죠.

    3) 2PL 프로토콜 ( 2 Phase Locking protocol )

    당연히 데드락이 걸리면 안되므로, 어떤 규칙에 의해서 고립성을 보장해야 한다는 2PL 프로토콜이 연구되었습니다.

    • 보수적 locking ( conservative locking )
      • 트랜잭션이 시작되면 모든 lock을 얻는 방식으로서, 데드락이 발생하지 않지만 병행성이 좋지 못함
      • 트랜잭션이 commit을 만날 때까지 lock을 갖고 있다가 commit을 만날때 unlock을 하는 방식으로 데드락이 발생하지만 병행성이 좋음
      • 일반적으로 병행성이 좋은 strict 방식을 사용합니다.

      6. MySQL InnoDB 엔진의 트랜잭션과 Locking

      지금까지 트랜잭션의 ACID 특징에 대해 알아보았습니다.

      RDB에서는 일반적으로 잠금 스케줄러를 사용하는데, 충분히 좋은 성능을 낼 수 있다고 합니다.

      지금까지 쿼리에서 transaction을 사용하면 자동으로 locking 처리가 되는 줄 알았는데, 제품에 따라 또는 설정에 따라 다른것 같습니다.

      트랜잭션 프로세서

      SQL Server 환경에서 가끔 SELECT 문을 수행하였음에도 결과가 반환되지 않고 오랜 시간 쿼리가 수행되는 현상이 발생할 때가 있습니다. 대부분 DML 활성 트랜잭션이 원인이 될 때가 많았습니다만 이를 확인하고 해결하는 방법에 대해서 간략히 정리하였습니다.


      [환경]
      SQL Server 2008 SP1


      [현상]
      아래와 같이 데이터 조회를 위해 SELECT 하였으나 조회되지 않고 '쿼리를 실행하는 중' 상태로 유지됩니다.
      SELECT UserID FROM TblUser WHERE UserCode = '03'


      [원인]
      UPDATE 트랜잭션에 의해 테이블이 잠겨 있으므로 트랜잭션이 완료될 때까지 SELECT 쿼리를 완료할 수 없습니다. 기본값으로 Dirty Read 를 허용하지 않기 때문입니다.


      [Action Plan]
      트랜잭션이 완료되지 않고 sleeping 상태로 대기하고 있는 상태이므로 강제 종료합니다. UPDATE 트랜잭션을 발생한 쿼리를 찾아 원인 분석을 진행합니다.

      [분석결과]
      1. 새 쿼리를 실행하여 현재 실행 중인 프로세스에 대한 정보를 확인합니다.

      SELECT * FROM sys.sysprocesses WHERE spid = 53

      spid kpid blocked
      -----------------------------
      53 4696 52

      SPID '52' 에 의해서 요청이 차단되었음을 확인할 수 있습니다.
      */


      2. 쿼리 확인
      마지막으로 전송된 쿼리를 확인합니다.

      BEGIN TRAN
      UPDATE TblUser SET UserID = 'Bobby' WHERE UserCode = '03'


      3. 가장 오래된 활성 트랜잭션 찾기

      /* 결과
      데이터베이스 'SupernaturalDB'의 트랜잭션 정보입니다.
      가장 오래 전에 활성화된 트랜잭션:
      SPID(서버 프로세스 ID): 52
      UID(사용자 ID) : -1
      이름 : user_transaction
      LSN : (22:174:1)
      시작 시간 : 10 16 2009 11:19:20:667AM
      SID : 0x010500000000000515000000eeced709a49479f270770942e8030000
      */

      Hyperledger Composer Transaction Processor Function(1)

      어떻게 하다 보니 여기까지 오긴 왔다. 이 링크 를 참고하여 트랜잭션을 관리(?)하는 함수를 작성해 보도록 하자! 예! 앞의 두 포스트는 이 포스트를 적기 위한 과정이었을 뿐. ㅠㅠ 험난했다.

      Hyperledger Composer 비즈니스 네트워크는 모델 파일과 스크립트가 set로 구성된다. 스크립트에는 모델 파일에 정의 된 트랜잭션을 구현하는 트랜잭션 프로세서 기능을 포함할 수 있다.

      Transaction Processor 함수는 BusinessNetworkConnection API를 사용하여 트랜잭션을 날릴 때 런타임에 의해 자동으로 호출된다.

      문서 내의 decorator는 런타임 처리에 필요한 메타 데이터를 주석으로 단다.

      각 트랜잭션에는 트랜잭션을 저장하는 레지스트리가 있다.

      트랜잭션 프로세서의 구조

      트랜잭션 프로세서 함수에는 Decorator, Metadata, JS 함수가 포함된다. 이 함수가 동작하기 위해서는 @param 과 @transaction 두 부분이 모두 필요하다.

      주석의 첫 번째 줄에는 트랜잭션 처리 함수가 수행하는 기능에 대한 설명이 들어 있다. 두 번째 줄에는 @param 매개 변수 정의를 나타내는 태그가 있어야 한다 . @param 태그 다음에는 트랜잭션 프로세서 기능을 트리거하는 트랜잭션의 리소스 이름이 온다. 이 태그는 비즈니스 네트워크의 네임 스페이스 형식과 트랜잭션 이름 뒤에 위치한다. 리소스 이름 뒤에, 리소스를 참조 할 매개 변수 이름이 있으면 이 매개 변수를 JavaScript 함수에 인수로 제공해야 한다. 세 번째 줄에는 @transaction 태그가 있어야 한다. 이 태그는 코드를 트랜잭션 프로세서 기능으로 식별하므로 꼭 필요하다.

      주석은 트랜잭션에 권한을 부여하는 JavaScript 함수이다. 이 함수는 임의의 이름을 가질 수 있지만 주석에 정의 된 매개 변수 이름( parameter-name )을 인수로 포함해야합니다.

      두 형식을 모두 적용한 코드는 다음과 같다.

      함수 작성하기

      트랜잭션 프로세서 함수는 모델 파일에 정의 된 트랜잭션의 논리적 연산이다. 예를 들어, Trade 트랜잭션의 트랜잭션 프로세서는 owner 의 값을 한 참여자에서 다른 참여자로 변경할 수 있다.( owner 가 a였는데 b가 되는 등의 변경)

      다음 basic-sample-network 예제의 SampleAsset 에 String 으로 정의된 value 속성이 있다. SampleTransaction 에 변경될 값인 newValue 를 value 속성으로 전달해야 한다.

      SampleTransaction 은 다음의 코드처럼 asset 및 asset이 저장된 레지스트리 모두를 변경한다.

      에러 처리하기

      트랜잭션은 딱 두 가지로 나뉜다. 성공해서 변경 사항이 적용되거나 실패하고 변경 사항이 적용되지 않거나(롤백).

      트랜잭션에서 모델의 관계 사용하기

      다음의 코드와 같이, 모델의 관계가 연결(?)되는 경우가 있을 것이다. transaction -> asset -> participant 순서로 타고 들어가는 접근이 가능하다.

      만약, transaction에서 participant로 접근하고 싶다면 함수를 아래와 같이 작성하면 된다.

      위의 경우, onwer 는 특정 참여자( tx.asset.owner )를 가리키게 된다.

      비동기 코드 및 Promise 처리

      transaction 함수는 commit 전 promise 가 해결될 때까지 기다린다. promise 가 반환될 때까지 트랜잭션은 완료되지 않는다.

      아래의 모델 파일을 활용한 함수를 작성해 보자.

      node 8부터는 async/awit 구문이 지원되기 때문에 promise 를 사용하는 것보다 간결히 코드를 작성할 수 있다. 권장하는 스타일은 다음과 같다.

      위 코드를 사용하면 sampleTransaction() 은 getAssetRegistry() 가 완료되기 전에 assetRegistry 에 값을 저장하지 않고, assetRegistry 의 update() 가 완료되어야만 정상적으로 종료된다.

      만약 개발자가 promise 구문을 그대로 사용하고 싶다면 다음와 같이 코드를 작성하면 된다.

      API 사용하기

      함수에서 Hyperledger Composer API 호출하기

      함수에서 적절한 인수를 사용하여 Hyperledger Composer API를 간단하게 호출할 수 있다.

      아래의 예제 getAssetRegistry 에서 트랜잭션은 트랜잭션이 완료되기 전에 해결되는 promise 를 반환한다.

      함수에서 Hyperledger Fabric API 호출하기

      Fabric API를 호출하려면 함수 getNativeAPI 를 먼저 호출해야 한다. 그 다음, Fabric API를 호출하여 사용할 수 있다. Fabric API를 사용하면 Composer API에서 사용할 수 없는 기능에 접근할 수 있다.

      중요: getState , putState , deleteState , getStateByPartialCompositeKey , getQueryResult 는 Hyperledger Composer ACL을 무시한다.

      getHistoryForKey 가 호출되면, 지정된 Asset의 History를 반환(return)한다. 트랜잭션 프로세서 함수는 반환 된 데이터를 배열에 저장한다.

      트랜잭션 프로세서

      하나의 완전한 일의 단위로 하나의 트랜잭션은 여러 가지 일을 포함한다.

      하나의 완전한 일의 단위이다. 완전히 수행되는 경우와 수행되지 않는 2가지 경우만 존재한다.

      트랜잭션의 성공적인 수행 결과를 공유 자원에 갱신한다. 트랜잭션이 실패하는 경우 공유 자원을 원래 상태로 유지한다.

      트랜잭션의 영향을 받은 공유 자원의 변동사항은 트랜잭션이 commit 되기 전에는 UPDATE 트랜잭션에 의한 테이블 잠금 확인 및 조치 다른 트랜잭션에 영향을 미치지 않는다.

      트랜잭션의 결과가 commit 된 후에는 언제나 보존된다.

      DTP (Distributed Transaction Processing)

      하나의 트랜잭션에 여러 RM(Resource Manager)이 관여하여 처리한다.

      터미널에 나타나는 한 화면에 대응되는 개념이다.

      트랜잭션의 실패나 사용자 임의에 의해 트랜잭션의 결과를 처리 이전의 원래 상태로 복구한다.

      TP-Monitor(Transaction Processing Monitor)

      각종 프로토콜에서 동작하는 세션과 시스템 및 데이터베 이스 사이의 최소 처리단위인 트랜잭션을 감시하여 일관성 있게 보관 및 유지하는 역할을 하는 트랜잭션 관리 미들웨어이다.

      중앙 집중식 메인프레임(Mainframe) 환경을 개방형 분산 시스템 환경으로 바꾸는 것이다.

      분산 컴퓨팅 환경에서 단일 사용자 환경을 제공하고 이기종 간 시스템의 네트워크를 연결하 거나 클라이언트와 서버 간의 통신을 담당하거나 또는 컴퓨터와 컴퓨터의 연결을 담당하는 시스템 소프 트웨어이다.

      WAS(Web Application Server)

      웹에서 트랜잭션을 처리하고 이기종간 상호 통신 기능(J2EE)을 제공하는 서비스이다.

      MOM(Messaging Oriented Middleware)

      메시지를 큐라고 불리는 전달 중계소에 넣어 처리하고 큐에 의한 메시지 관리 기능을 제공(비동기적)하 는 서비스이다.

      Database Access System

      분산 환경에서 복수 개의 데이터베이스 서버들을 일관된 방법으로 이용할 수 있는 환경을 제공하는 서 비스이다.

      네트워크에서 다른 컴퓨터에 있는 프로그램을 실행(동기적)하는 서비스이다.

      ORB(Object Request Broker)

      클라이언트 객체가 ORB라는 소프트웨어 버스를 이용하여 원격지 서버의 메소드를 호출하는 기능을 제 공하는 서비스이다.

      CLH (Client Handler)

      클라이언트 핸들러이다. 클라이언트와 서버 사이를 중계하며, 서비스를 제공하는 업무처리 서버에 서 비스를 요청하고, 서버에 대한 연결 및 관리를 한다.

      TMS (Transaction Management Server)

      데이터베이스 관리 및 분산 트랜잭션 처리를 담당하는 프로세스로 데이터베이스 관련 시스템에서 동작 한다. XA 서비스에서 발생하는 commit/rollback을 RM(Resource Manager)에 전달한다.

      TLM (Transaction Log Manager )

      트랜잭션이 발생할 때 실제 CLH가 commit을 수행하기 전에 TLM을 통해서 트랜잭션 로그를 저장한다.

      GW (Gateway Process)

      여러 도메인으로 구분된 경우에 도메인 간의 통신을 담당한다.

      Tmadmin (Tmax Administrator)

      Tmax 관련 정보 모니터링 및 환경파일 변경 등을 관리한다.

      RACD (Remote Access Control Daemon)

      Tmax가 설치된 모든 도메인을 원격으로 통제한다.

      TCS (Tmax Control Server)

      CLH의 요청에 의해 비즈니스 로직을 처리하고 결과를 반환한다.

      UCS (User Control Server)

      CLH의 요청에 의해 비즈니스 로직을 처리하고 결과를 반환하면서 해당 프로세스가 control을 유지한다.

      TIP (Tmax Information Provider)

      시스템 환경 정보와 통계 정보를 확인하고, 시스템을 운용 및 UPDATE 트랜잭션에 의한 테이블 잠금 확인 및 조치 관리한다.

      TIM(Tmax Information MAP)

      Tmax 시스템을 운용하는 핵심 정보로 Tmax에서 관리하는 공유 메모리를 말한다. TIM은 엔진 프로세스 중에 TMM 프로세스에 의해서 생성된다.

      SLM (System Load Management)

      정의된 부하 비율로 분산 처리하는 방식이다.

      DDR (Data Dependent Routing)

      데이터 값에 따라 분산 처리하는 방식이다. 여러 노드에서 공통된 서비 스를 제공하면 데이터 범위에 따라 노드 간 라우팅을 할 수 있도록 지정한다.

      DLM (Dynamic Load Management)

      부하 비율에 따라 동적으로 처리 그룹을 선택하는 방식이다. 특정 노드에 부하가 집중되는 경우 Tmax 동적 부하 조절 방법에 따라 부하를 분산하여 전체 시스템의 처리량 을 증가시키고 처리 시간을 단축한다.

      TCS (Tmax Control Server)

      클라이언트가 요청하면 수동적으로 실행되는 프로세스로 대부분은 이 프로세스가 사용된다.

      UCS (User Control Server)

      호출자의 요청이 없어도 능동적으로 데이터를 전달할 수 있는 프로세스로 Tmax만의 고유 기능 이다.

      POD (Processing On Demand)

      클라이언트의 요청이 있을 때만 서버 프로세스가 기동되어 처리할 수 있도록 하는 방식이다.

      RCA (Raw Client Agent)

      멀티 스레드 방식으로 프로세스를 효율적으로 처리할 수 있는 다중 포트를 지원한다.

      SCA (Simple Client Agent)

      Non-Tmax 클라이언트/Tmax 클라이언트 모두 수용할 수 있는 다중 포트를 지원한다.

      2PC(Two-phase commit) protocol

      둘 이상의 동종 및 이종의 데이터베이스가 관련된 전역 트랜잭션에서는 트랜잭션의 속성을 보장하기 위해 2단계(2 Phase) commit을 지원하여 데이터 무결성을 보장하고 API를 제공한다. 1단계 (Prepare Phase), 2단계 (Commit Phase)

      서비스 수행도중 장애 등으로 인하여 요청 내용이 사라지는 것을 방지하 여 서비스가 신뢰성있게 처리되도록 한다.

      HMS(Hybrid Messaging System)

      Tmax의 기능으로 Sender와 Receiver의 느슨한 결합(loosely coupled)을 위한 통신 매개체이며, Queue 방식과 Topic UPDATE 트랜잭션에 의한 테이블 잠금 확인 및 조치 방식을 지원한다.

      클라이언트/서버 환경의 미들웨어 제품인 Tmax와 Java 애플리케이션 프로그 램 사이의 트랜잭션 서비스를 지원한다.

      NULL 값으로 끝나는 문자열로 따로 버퍼의 길이를 명시할 필요가 없다.

      CARRAY, X_OCTET 버퍼

      길이가 지정된 Byte 열로 구성된 버퍼로 보통 바이너리 타입의 데이터를 보낼 때 사용되며 데이터 교환 시에는 반드시 길이를 명시해야 한다.


0 개 댓글

답장을 남겨주세요