트랜잭션(Windows 이벤트)

적용 대상: Windows | Windows Server

트랜잭션

ESE 트랜잭션은 애플리케이션이 데이터베이스의 행을 보고 조작하는 방법을 제어하는 논리적 처리 단위입니다. 애플리케이션은 트랜잭션 저장 지점을 사용하여 데이터베이스에 대한 특정 변경 내용 집합을 유지하거나 삭제할지 여부를 결정할 수 있습니다. ESE의 모든 트랜잭션은 아래 설명된 대로 원자성, 일관성, 격리 및 지속성(ACID)입니다.

  • 원자: 트랜잭션의 모든 업데이트는 데이터베이스에 표시되거나 삭제됩니다.
  • 일관 된: 데이터베이스는 항상 법적 상태로 시작되며 항상 다른 법적 상태로 종료됩니다. ESE 애플리케이션의 경우 데이터베이스 엔진은 고유한 인덱스의 고유성과 같은 몇 가지 간단한 제약 조건을 제어하지만, 애플리케이션 자체는 데이터베이스가 법적 상태에 있는 것이 무엇을 의미하는지에 대한 거의 모든 다른 측면을 정의합니다.
  • 격리: 트랜잭션은 다른 세션에 의해 업데이트에서 격리됩니다. 트랜잭션에는 다른 트랜잭션에서 변경한 부분 집합이 표시되지 않습니다.
  • 튼튼한: 데이터베이스 엔진이 트랜잭션이 커밋되었음을 승인한 후에는 해당 변경 내용이 데이터베이스에서 지속됩니다. 트랜잭션의 내구성은 성능상의 이유로 선택적으로 포기될 수 있습니다.

트랜잭션은 JetBeginTransaction 및 JetCommitTransaction 또는 JetRollback에 대한 호출 범위 내에서 수행됩니다. 애플리케이션이 트랜잭션에 들어가면 트랜잭션이 시작될 때 인스턴스에서 데이터베이스가 고정된 것으로 표시됩니다. 이를 스냅샷 격리라고 합니다. JetRollback을 호출하여 트랜잭션을 종료하는 경우 트랜잭션에서 수행된 작업이 데이터베이스에 커밋되지 않습니다. JetCommitTransaction이 호출되기 전에 프로세스 또는 컴퓨터가 충돌하는 경우 JetRollback 호출과 동일합니다.

이 절차에서는 데이터베이스에서 데이터를 읽고 업데이트하는 트랜잭션을 시작하고 커밋하는 방법을 보여 줍니다.

트랜잭션을 시작하고 커밋하려면

  1. 세션 ID를 사용하여 JetBeginTransaction 또는 JetBeginTransaction2 를 호출하여 트랜잭션을 시작합니다.

  2. cRow 매개 변수에 지정된 JET_MoveFirst 사용하여 JetMove를 호출하여 커서를 원하는 레코드로 이동합니다. 커서를 이동하는 방법에 대한 자세한 내용은 테이블 항목의 인덱싱을 참조하세요.

  3. InfoLevel 매개 변수에 지정된 JET_ColInfo 사용하여 현재 레코드에서 JetGetTableColumnInfo를 호출하여 열의 열 ID를 검색합니다. 열 ID는 JET_COLUMNDEF 구조에 반환됩니다.

  4. 업데이트되는 열의 세션 ID, 테이블 ID 및 열 ID를 사용하여 JetSetColumn 을 호출합니다. 열 데이터는 pvData 매개 변수에 포함됩니다.

  5. JetCommitTransaction을 호출하여 트랜잭션을 데이터베이스에 커밋합니다.

ESE 데이터베이스 엔진이 스냅샷 격리를 구현하는 방식은 기존의 관계형 데이터베이스 격리 및 잠금 모델과는 몇 가지 중요한 차이점이 있습니다. 트랜잭션이 행을 읽을 때 실패하거나 다른 세션이 잠금을 해제할 때까지 기다리지 않고 행에 항상 액세스할 수 있습니다. 트랜잭션이 행을 업데이트하려고 하면 해당 행을 업데이트하는 첫 번째 세션인 경우 첫 번째 기록기가 성공합니다. 세션이 첫 번째 기록기가 아닌 경우 쓰기 충돌 오류로 즉시 실패합니다. 그런 다음 세션은 트랜잭션을 중단하고 다른 트랜잭션이 변경 내용을 커밋할 때까지 기다렸다가(일반적으로 임의 지연을 통해) 트랜잭션을 다시 시도해야 합니다. 데이터베이스 엔진은 다른 트랜잭션이 업데이트를 완료할 때까지 해당 세션이 자동으로 대기하도록 하지 않습니다. 일반적으로 트랜잭션은 JetUpdate 호출 내에서 행을 업데이트할 수 있는지 테스트합니다. 업데이트를 위해 행을 잠글 수 없는 경우 JetUpdate 는 JET_errWriteConflict 함께 실패합니다.

세션은 트랜잭션이 시작되는 시점부터 트랜잭션이 끝날 때까지 하나의 스레드로 제한됩니다. 트랜잭션에서 모든 업데이트 및 검색 작업을 수행하는 것이 좋습니다. ESE는 테이블 만들기 및 트랜잭션 내부에 열 추가와 같은 스키마 수정도 지원합니다. 업데이트 및 스키마 수정은 모두 동일한 트랜잭션에서 수행할 수 있습니다. JetCommitTransaction을 사용하여 트랜잭션이 완료되면 업데이트가 트랜잭션 로그 파일에 기록됩니다. 이러한 파일은 예기치 않은 프로세스 종료 또는 시스템 종료 시 논리적으로 일관된 상태를 유지하는 데 사용할 수 있습니다.

트랜잭션은 JetBeginTransaction 및 JetCommitTransaction 또는 JetRollback에 대한 일치 호출이 서로 중첩된 상태에서 최대 7개 수준까지 중첩될 수 있습니다. 이렇게 하면 애플리케이션이 전체 트랜잭션에서 백아웃하지 않고도 트랜잭션의 일부를 롤백할 수 있습니다. JetCommitTransaction에 대한 중첩 호출은 이 처리 수준이 완료되었음을 의미합니다. 그러나 트랜잭션은 외부에서 JetCommitTransaction을 사용하여 트랜잭션을 커밋하기 위해 가장 호출될 때까지 데이터베이스에 커밋되지 않습니다.

에스크로 업데이트 열은 Jet_errWriteConflict 실패하지 않고 여러 세션에서 동시에 업데이트할 수 있습니다. JetEscrowUpdate 함수는 에스크로 열, Jet_bitColumnEscrowUpdate 사용하여 만든 열에서만 호출할 수 있습니다.