DB/수업2017. 7. 4. 22:20

1. COMMIT 연산(완료) 

COMMIT 

    - 트랜잭션이 연산을 완료된 것에 COMMIT 문장을 통해 트랜잭션 

         관리자에게 알려 주는 연산 

      - 트랜잭션에서 변경하려는 내용이 데이터베이스에 완전하게 반영됨 

     - SQL 구문상으로 COMMIT WORK 

 

ROLLBACK 연산 

     - 트랜잭션이 행한 모든 연산을 취소시키거나 트랜잭션을 재 시작하도록 함 

 

COMMIT 

    - 트랜잭션 실행이 성공적으로 완료되어 COMMIT 연산을 수행한 상태를 의미 

      - 계좌 이체를 하는 트랜잭션을 간략한 코드로 표현한 프로그램 소스 

  

 

 

 

  

A 계좌에서 B 계좌로 2000을 이체하는 트랜잭션 예를 프로그램으로 구현한 

것이다(프로그램 소스는 프로그래밍 언어마다 문법이 다를 수 있다). 

 

[프로그램 설명] 

1.  ACCT_SAVE 테이블에는 많은 항목들이 존재하지만, 그 중에서 

acct_name (계좌번호), acct_amt(잔액) 두개의 항목만을 사용해 보았다. 

2.  tmp_amt 변수는 서버에서 해당 조건에 맞는 acct_amt(잔액) 항목 값을 

읽어들여 잠시 저장하는 임시 변수이다. 즉 해당 계좌에 계좌 이체를 할 수 

있는지 잔액을 확인하기 위한 변수이다. 

3.  // 표시는 프로그램을 설명하는 주석이다. 


==================================================

 ACCOUNT_TRANS:       //  트랜잭션  이름 

   Begin_transaction       //  트랜잭션의 시작으로<활동(active)>상태유지 

  { 

       SELECT acct_amt  INTO :tmp_amt    //    A 계좌에서 잔액을 조회하여 

       FROMACCT_SAVE           //      임시변수 tmp_amp에 저장 

       WHERE acct_name = ‘A‘; 

                                                     //      A 계좌에서 B 계좌로2000을 이체하기 위한 잔액 비                 

                                                              교 루틴  

       IF tmp_amt<2000then         //       tmp_amt 내에 값을 비교하여 잔액이 부족하면, 

       {                            //       메시지로 결과를 알린 후 

         printf(“잔액이부족한다“);           //        더 이상 진행하지 않고, ERR_RTN 루틴 실행 

         GOTOERR_RTN;                       //        트랜잭션상태 <실패(failed)>이며, 

       }                                            //        <철회(aborted)>로 이동 예정 

       else 

  {                                                  // 잔액이 부족하지 않으면, 계좌 이체 루틴 실행 

 UPDATE ACCT_SAVE 

 SETacct_amt=acct_amt-2000 

 WHERE acct_name = ‘A‘; 

 IFERRORthenGOTOERR_RTN;     // 문장을 수행하다가 문제가 발생하면, ERR_RTN 루틴 실행 

                                                  // 트랜잭션상태 <실패(failed)>이며, <철회(aborted)>로 

 UPDATEACCT_SAVE                       //  이동 예정 

 SETacct_amt=acct_amt+2000 

 WHERE acct_name = ‘B‘; 

                                                 //  마지막 명령문 수행 직후 

                                                 //  트랜잭션 상태 <부분완료(PARTIALLYCOMMITTED)> 

 IFERRORthenGOTOERR_RTN;     //  문장을 수행하다가 문제가 발생하면, ERR_RTN 루틴 실행 

                                                //  트랜잭션상태 <실패(failed)>이며, <철회(aborted)>로 

                                                //  이동예정 

 COMMIT;                                  //   정상적으로 문장이 수행되어 COMMIT문 수행 

 printf (“계좌이체가 정상적으로 수행되었다“); // <완료(committed)> 

  GO TO END_RTN; 

 } 

  ERR_RTN; 

  ROLLBACK;                                           // 문장 수행을 실패하여 ROLLBACK문 수행<철회(aborted)> 

 

  END_RTN; 

  RETURN; 

End_transaction 

============================

COMMIT과 ROLLBACK의 비교    

2. ROLLBACK 연산(복귀)

트랜잭션이 성공하지 못하는 원인  

시스템(사이트) 고장 

중앙 처리 장치, 주기억 장치, 전원 공급 장치 등이 고장남 

트랜잭션 고장 

트랜잭션 고장은 트랜잭션이 수행되는 도중에 철회됨 

매체 고장 

디스크 헤드, 디스크 콘트롤러 등이 고장 나서 보조 기억 장치의 전부 또는 일부 내용이 지워짐 

통신 고장 

자연적 재해 

부주의 또는 고의적인 고장 




Posted by 멜데스