Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

[DocWiki 번역] 트랜젝션 관리하기 (FireDAC)


Recommended Posts

Docwiki에 있는 "Managing Transactions (FireDAC)"를 번역한 글: 번역일: 2022년 3월 29일)

위로 가기: [DocWiki 번역] 연결(connection)을 가지고 작업하기 (FireDAC)

FireDAC을 사용하여 DBMS 트랜젝션을 관리하는 방법을 설명한다. FireDAC에서 제공하는 TFDConnection과 TFDTransaction을 이용하면 데이터베이스 트랜젝션을 다룰 수 있다.

목차


1 일반 (General)

기본 설정인 경우, FireDAC 애플리케이션은 자동-커밋 (auto-commit) 모드로 작동한다. 이 모드에서는 트랜젝션이 필요할 때 FireDAC이 자동으로 트랜젝션을 시작하고, 명령(command) 실행이 성공하면 커밋하고, 실패하면 롤백한다. FireDAC의 자동-커밋은 TFDTxOptions.AutoCommit 프로퍼티를 통해 다룰 수 있다. 자동-커밋 모드는 애플리케이션에서 쉽게 사용할 수 있다. 하지만,

  • 데이터베이스에게 여러개의 업데이트를 보내면 느려진다.
  • 단일 트랜젝션 안에서 더 많은 데이터베이스 동작을 하도록 만들 수 없다.
  • 한번 실행될 때 연장할 수 없다.

대안으로, 애플리케이션에서 "명시적 트랜젝션 제어"를 사용하는 방법이 있다. 그렇게 하려면, TFDConnection에 있는 메소드인 StartTransaction, Commit, Rollback을 사용한다. 또 다른 방법으로 TFDTransaction 컴포넌트를 사용할 수도 있다. 

주의: FireDAC에서 TFDTransaction 컴포넌트를 사용하는 것은 필수가 아니라 옵션이다.

FireDAC에서 제공하는 Isolation, ReadOnly, Params 프로퍼티를 이용하면 트랜젝션 모드를 제어할 수 있다. 이 프로퍼티들은 자동-커밋과 명시적 트랜젝션 모두에서 적용된다. 하지만, 모든 DBMS가 모든 모드를 지원하지는 않는다. 예를 들어, ReadOnly 모드는 제약이 더 적은 모드를 적용하도록 FireDAC 차원에서 구현한 것이다.  모든 설정은 다음 트랜젝션부터 적용된다는 점을 명심하자. 

명시적 트랜젝션을 사용하는 표준 코드:  

FDConnection1.StartTransaction;
try
  FDQuery1.ExecSQL;
  ....
  FDQuery1.ExecSQL;
  FDConnection1.Commit;
except
  FDConnection1.Rollback;
  raise;
end;

TFDTransaction 컴포넌트는 트랜젝션 제어 기능을 감싸서 넣어둔 컴포넌트이다. 사실 상, TFDConnection에서 제공하는 트랜젝션 기능과 동일한 기능을 제공하지만, 명령(command)과 데이터셋 여러 개를 특정 트랜젝션 오브젝트 하나에 연결하여 묶을 수 있다. 무엇보다 TFDTransaction은 다중 활성 트랜젝션(Multiple Active Transactions)을 지원한다. 이 기능은 InterBaseFirebird 서버의 기능이기도 하다.

TFDTxOptions.Params는 DBMS 별로 고유한 트랜젝션의 특성을 명시할 때 사용한다. 현재는 Firebird / InterBase 드라이버에서만 이런 특성을 지원한다. 특성은 한줄에 하나씩 명시해야 한다. 이것은 isc_tpb_<attribute name> 에 대응된다.
 

2 중첩된 트랜젝션 (Nested Transactions)

FireDAC에서 지원하는 DBMS 중 어느 것도 중첩된 트랜젝션을 직접 지원하지 않지만, FireDAC은 저장점(savepoint)를 이용하여 이 기능을 모방(emulate)한다. 따라서 중첩된 StartTransaction인 경우, 호출되어도 새 트랜젝션이 시작되지 않는다. 또한 예외(exception)를 발생시키지 않고 대신 저장점(savepoint)를 넣는다. 만약 저장점을 지원하지 않는 DBMS라면 "Capability is not supported" 예외가 발생된다.
중첩된 트랜젝션 기능을 비활성화 하려면,  TFDTxOptions.EnableNestedFalse로 지정한다. 이렇게 지정한 다음에 StartTransaction을 중첩하여호출하면 예외가 발생한다.

시작한 중첩 트랜젝션에 대응하여 Commit을 호출하면 저장점(savepoint)을 해제하고, Rollback을 호출하면 저장점으로 롤백한다. 예를 들어

// 새 트랜젝션을 시작
FDConnection1.StartTransaction;
try
  FDQuery1.ExecSQL;
  ....

  // 저장점을 설정
  FDConnection1.StartTransaction;
  try
    FDQuery1.ExecSQL;
    ....

    // 저장점을 해제
    FDConnection1.Commit;
  except
    // 저장점으로 롤백
    FDConnection1.Rollback;
    raise;
  end;

  // 트랜젝션을 커밋
  FDConnection1.Commit;

except
  // 트랜젝션을 롤백
  FDConnection1.Rollback;
  raise;
end;

주의: 중첩된 트랜젝션은 최상위 트랜젝션의 설정을 사용한다.

 

3 지속적인 트랜젝션 (Continuous Transactions)

CommitRetaining, RollbackRetaining 메소드는 Commit, Rollback 메소드와 비슷하지만, 트랜젝션을 끝내지 않는다. 그러므로, 메소드가 호출된 이후에도 트랜잭션은 여전히 활성 상태로 남아있다. Firebird / InterBase 서버는 DBMS 코어 수준에서 이 기능을 지원한다. 그 이외의 DBMS에서는 FireDAC이 Commit / Rollback, StartTransaction 호출을 이용하여 이 기능을 모방(emulate) 한다.

 

4 다중 활성 트랜젝션 (Multiple Active Transactions)

Firebird와 InterBase는 DBMS 코어 수준에서 다중 활성 트랜젝션(Multiple Active Transactions)을 지원한다. 따라서 명령(command) 여러 개를 하나의 트랜젝션 문맥 안에서 수행할 수 있고, 또다른 명령 여러 개를 두번째 트랜젝션 문맥 안에서 수행할 수 있으며, 이런 식으로 세번째, 네번째 등등얼마든지 활성 트랜젝션을 여러개 사용할 수 있다. FireDAC이 제공하는 TFDTransaction 컴포넌트가 이 기능을 지원한다. TFDTransaction 인스턴스 하나를 사용하여 트랜젝션 하나를 주어진 시점에 처리할 수 있다. 
TFDCustomConnection의 프로퍼티들을 사용하면 기본(default) 트랜젝션 오브젝트를 설정할 수 있다.

  • Transaction - 모든 명령(command)에서 사용될 기본 트랜젝션. 
  • UpdateTransaction - 모든 업데이트 명령(command)에서 사용될 기본 트랜젝션. FireDAC 데이터셋이 업데이트를 전달(post)할 때 사용된다. TFDQuery 컴포넌트에서 명시적으로 UPDATE 쿼리를 지정하거나, 기타 이와 같이 명시적으로 지정한 경우에는 이 기본 UpdateTransaction가 사용되지 않는다는 점을 알아두자.  

TFDCustomQuery와 기타 컴포넌트들에도 비슷한 프로퍼티들이 있다. 

  • Transaction - 지정한 SQL 쿼리를 실행할 때 사용할 트랜잭션 오브젝트를 명시한다.
  • UpdateTransaction - 데이터셋이 업데이트를 전달(post)할 때 사용할 트랜잭션 오브젝트를 명시한다.

대체로, Firebird / InterBase 애플리케이션에서 트랜젝션 오브젝트를 설정하는 가장 좋은 방법은 다음과 같다.

UpdateTransaction: TFDTransaction;
ReadTransaction: TFDTransaction;
...
// 업데이트 명령용 트랜젝션을 설정: read_committed, rec_version, nowait
UpdateTransaction.Connection := FDConnection1;
FDConnection1.UpdateOptions.LockWait := False;
UpdateTransaction.Options.ReadOnly := False;
UpdateTransaction.Options.Isolation := xiReadCommitted;
...
ReadTransaction.Connection := FDConnection1;
ReadTransaction.Options.ReadOnly := True;
ReadTransaction.Options.Isolation := xiReadCommitted;
...
SelectQuery.Transaction := ReadTransaction;
SelectQuery.UpdateTransaction := UpdateTransaction;

주의: 다른 DBMS 용으로 TFDTransaction을 하나 이상 사용할 수 있다. 그러면, 모든 TFDTransaction 컴포넌트들이 동일한 트랜젝션을 공유한다.

 

5 트랜젝션과 커서 (Transactions and Cursors)

DBMS는 오픈(open)된 커서와 이 커서를 오픈(open)한 트랜젝션 문맥을 연결한다. DBMS는 해당 트랜젝션이 완료될 때 해당 활성 커서들도 무효화(invalidate) 된다. 정확한 동작은 DBMS에 따라 다르다.

DBMS 액션(Action)
Microsoft Access StartTransaction / Commit / Rollback 시 커서를 무효화한다.
Firebird Commit / Rollback 시 커서를 무효화한다.
Informix <아무 동작도 안함>
InterBase Commit / Rollback 시 커서를 무효화한다.
IBM DB2 Rollback 시 커서를 무효화한다.
MySQL StartTransaction / Commit / Rollback 시 커서를 무효화한다.
Oracle <아무 동작도 안함>
PostgreSQL Commit / Rollback 시 커서를 무효화한다.
SQLite Rollback 시 커서를 무효화한다.
SQL Anywhere <아무 동작도 안함>
SQL Server StartTransaction / Commit / Rollback 시 커서를 무효화한다.
Teradata Database <아무 동작도 안함>

FireDAC은 커서 무효화를 유발하는 트랜잭션 제어 명령을 발견하면 FetchOptions.AutoFetchAll에 지정된 작업을 수행하고 커서를 해제한다.

주의: Firebird / InterBase 서버는 트랜잭션이 완료될 때, 준비되어 있던(prepared) 명령문을 무효화한다. 따라서 자동-커밋 모드는 이 DBMS의 성능을 저하시킬 수 있다.

6 기타 자료 (See Also)

 

6.1 예제(Samples)

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.