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

델파이 강좌/문서
Delphi Programming Tutorial&Documents
[59] [강좌] 타라기의 BDE Transaction
타락천사 [rain622] 23046 읽음    2002-07-11 12:30
[강좌] 타라기의 BDE Transaction

안녕하세여. 타락임다.

먼저 본문은 정보문화사  Delphi5 Programming Bible 에서 인용했습니다. 따라서 책을 열라 뒤지다 보면 토씨 하나 틀리지 않은 글을 볼수 있게 될겁니다.

기본 설명에 이어 BDE Transaction 을 설명하겠습니다.


1. 트랜잭션 (Transaction)

SQL 데이터베이스는 트랜잭션 지향적입니다. 데스크탑 데이터베이스와 달리 데이터에 가해진 변경이 직접 테이블에 적용되지 않으며, 클래이언트 애플리케이션이 데이터에 가한 다양한 변경들을 서버가 일괄적으로 하나의 트랜잭션으로 처리함다.

트랜잭션이란, 전체가 성공하거나 전체가 실패하는 것이라고 이해하면 됨다. 트랜잭션에 속한 어떤 작업이 하나라도 실패하면 데이터베이스의 상태는 트랜잭션이 시작되기 이전 상태로 돌아감다 (Roll Back).

트랜잭션은 서버에 있는 데이터의 일관성을 보장하기 위한 것임다.

참고: 일부 데스크탑 데이터베이스들도 트랜잭션을 지원함다 (파라독스 7 등).


2. 레코드 잠금 (Lock)

잠금(Locking)이란, 동일한 데이터베이스에 대해 여러 사용자가 SQL 트랜잭션을 할 수 있도록 하기 위한 기법이다. 잠금에는 여러 수준이 있는데, 서버마다 적용하는 잠금 수준이 다름다.

테이블 단위의 잠금이란, 트랜잭션이 진행중인 테이블을 수정할 수 없도록 만드는 것임다. 이 기법으로도 병렬적인 트랜잭션을 수행할 수 있지만, 테이블 단위로 잠금이 진행되므로 병목 현상이 심할 수 밖에 없슴다.

그 보다 좀더 진보적인 기법이 페이지 단위 잠금임다. 이 경우 서버는 페이지, 즉 디스크에 있는 데이의 특정 블록 단위로 잠금을 수행함다. 어떤 페이지에 트랜잭션이 진행중이면 다른 트랜잭션에서는 그 페이지에 변경을 가할 수 없슴다. 일반적으로, 테이블은 수백 개의 페이지로 구성되므로 동시에 둘 이상의 트랙잭션이 동일한 페이지를 요구할 확률은 데이블 단위의 잠금에서 보다 훨씬 더 적슴다.

세밀한 잠금 기법이 레코드 단위 잠금인데, 이것은 레코드, 즉 데이터베이스 테이블의 특정 행(row) 단위로 잠금이 일어나는 것임다. 그러나 단위가 너무 작기 때문에 잠금 정보를 관리하는데 부담이 큼다.

MS-SQL 은 optimistic lock 이란 개념을 씀다. 이것에 대한 설명은 주제와 좀 떨어진것 같슴다.
어쨌든 optimistic lock 에서 데이터 무결성의 점검은 저장시에 일어나므로 클라이언트에 대한 서버의 반응이 데스크탑 데이터베이스에 비해 훨씬 더 빠름다.


3. 트랜잭션 처리

타라기 Note : Delphi5 애플리케이션의 트랜잭션 기본 처리는 트랜잭션이 레코드 단위에 기반해서 이루어짐다. 

델파이는 기본적으로 레코드 단위에 기반해서 트랜잭션이 시작/완료 됩니다. 코드나 컴포넌트 내부에서 Edit()나 Insert() 등의 메소드를 호출하면 트랜잭션이 자동적으로 시작되며, Post() 나 Cancel() 을 호출하면 트랜잭션이 완료 또는 취소됨다. 이 방식은 레코드별로 트랜잭션이 일어나므로 네트웍에 과중한 부담을 초래할 수 있슴다.

명시적으로 트랜잭션의 시작, 완료, 취소를 코드에서 직접 지시 할 수도 있습니다. TDataBase의 StartTransaction(), Commit(), Rollback() 이 트랜잭션을 제어하기 위한 메소드 들임다. 이 외에도 TQuery 컴포넌트의 SQL 질의문 차원에서 트랜잭션을 제어할 수도 있슴미다.

어쨌든 명시적인 트랜잭션 처리는 네트웍 부담을 줄일 수 있고, 좀더 안전한 코드를 작성할 수 있으므로 우월한 방법입니다.


4. CachedUpdate Property

TDataSet 상속 컴포넌트들에는 CachedUpdate 라는 속성이 있슴다. 이 속성을 이용하면 질의나 저장 프로시저를 갱신 가능한 뷰로 전환시킬 수 있슴다. 즉 데이터셋에 가해진 변경이 즉시 서버에 적용되는 것이 아니라 클라이언트쪽의 임시 버퍼에만 기록됨다. 임시 버퍼에 기록된 변경을 실제로 서버에 적용하려면 TQuery 나 TStoredProc 컴포넌트의 AppliyUpdates() 메소드를 호출함다. 캐쉬를 이용한 데이터셋의 갱신은 수행 성능 최적화에 큰 도움이 되며, 서버 쪽에서 lock에 관련된 충돌이 일어날 가능성을 줄이는 역할을 함다.


5. SQL pass-through mode

Delphi5 데이터베이스 어플리케이션과 BDE가 데이터베이스 서버에 대한 연결을 공유하는 방식을 지정하기 위한 것임다. pass-through mode 는 BDE 관리 툴을 통하여 설정함다. pass-through mode에는 다음과 같은 세 가지가 있슴다.

- SHARED AUTOCOMMIT : 트랜잭션이 레코드 단위에 기반해서 이루어짐다. Client/Server 입장에서는 네트웍 부담을 가중시키므로 별로 좋지 않슴다. 그러나 이 모드가 Delphi5 애플리케이션의 기본 설정이라는 점을 기억해 두기 바람다.

- SHARED NOAUTOCOMMIT : Delphi5 애플리케이션이 TDatabase.StartTransaction(), Commit(), RollBack() 메소드를 이용해서 트랜잭션을 명시적으로 시작, 완료, 취소 해야 함다.

- NOT SHARED : SQL 코드가 BDE의 능력에 제한을 받지 않으며, SQL 코드에 서버에만 관련된 기능들을 포함 시킬수 있다는 말임다.

pass-through mode 를 SHARED NOAUTOCOMMIT 으로 설정한 다음, 애플리케이션 안에서 TDatabase 의 메소드들을 이용해서 트랜잭션을 명시적으로 제어함다. 대부분의 경우, 이 정도로도 충분히 원하는 작업을 할 수 있슴다. 그러나 다중 사용자 환경에서 동일한 레코드들이 자주 갱신된다면 충돌이 일어날 수도 있다는 점을 염두에 두어야 한다.

+ -

관련 글 리스트
59 [강좌] 타라기의 BDE Transaction 타락천사 23046 2002/07/11
(링크)     C++Builder 강좌/문서자료 > [강좌] 타라기의 BDE Transaction
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.