C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[199] 명시적 트랜잭션의 구체 코드
에보니.^ㅅ^ [mortalpain] 7802 읽음    2001-10-10 11:56
안녕하세요 에보니입니다.

헐 밑의 내용은 제가 언젠가 함 올릴려고 햇는데 시간이 없서서 못올리고 잇섰는데..

아~ 참 제가 말뿐인 사람이 아닌데 세상이 자꾸 그렇게 만듬다  =ㅅ=;;

타락님이 아주 잘 설명하셧군여.

자 그럼 제가 보충을 안할수 없죠...

제목에도 써 있듯이 명시적 트랜잭션의 구체코드를 함 볼까요?

if ( !Dbcon->InTransaction ) Dbcon->StartTransaction();
else
{
   Dbcon->Commit();
}

try
{
   .......

   데이타 작업을 수행한다.
   .......

   Dbcon->Commit();
}

catch (...)
{
   Dbcon->Rollback();
}

일반적으로 데이타베이스의 TransIsolation 속성을 지정한 다음 StartTransaction 이라고 하는 메소드를 사용하여 트랜잭션을 사용합니다. 근데 이놈은 중첩하여 사용할수가 없서여.
그러니까 이미 트랜잭션이 이미 걸려있는 경우에는 이넘을 쓸수 없다는 얘기입니다.

따라서 작업의 요지는 현재 트랜잭션이 시작되어 있는지를 검사한후에 트랜잭션이 안 걸려 잇슬때만 이놈을 사용할 수 잇다는 얘기입니다. 현재 트랜잭션인지 아닌지는 InTransaction 이라고 하는 프로퍼티를 사용하는데 이넘은 현재 트랜잭션 중이면 참 아니면 거짓의 똥을 쌉니다.

그리고 그 똥을 함부로 건드릴 수 없습니다. 그리고 이똥이 변하는데....   =ㅅ=;;
StartTransaction 메소드가 호출시엔 true 로 바뀌엇다가 Commit 이나 Rollback 메소드가 수행된 후
false 로 바뀝니다.

커밋은 적용, 롤백은 변경을 취소 한다는 메소드입니다.

뭐 bde 로는 이정도 트랜잭션이면 꽤 먹어주는데....

다음은 ado 코드입니다.

ado 는 데이타베이스 컴포넌트 대신 adoconnection 을 사용합니다. 자 그럼 봅시당.

if ( !Dbcon->InTransaction ) Dbcon->BeginTrans();
else
{
   Dbcon->CommitTrans();
}

try
{
   .......

   데이타 작업을 수행한다.
   .......

   Dbcon->CommitTrans();
}

catch (...)
{
   Dbcon->RollbackTrans();
}


자 메소드랑 컴포넌트만 바꼈죠? 뭐 연결 스트링은 필수고..

근데 이것들은 c/s 방식이 짙습니다. multi-tier 에서는 따로 트랜잭션 서버를 둔다든지 그러죠.

그래도 쓰면 좋겠죠?

솔직히 ado 를 사용할때 DTC(분산 트랜잭션 코디네이러)와 MTS(마이크로소프트 트랜잭션 서버)의 힘을 빌리면 더 좋은 성능을 발휘할 수 있습니다.

+ -

관련 글 리스트
199 명시적 트랜잭션의 구체 코드 에보니.^ㅅ^ 7802 2001/10/10
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.