다음을 통해 공유


JetBeginTransaction 함수

적용 대상: Windows | Windows Server

JetBeginTransaction 함수

JetBeginTransaction 함수는 세션이 트랜잭션을 입력하고 새 저장 지점을 만듭니다. 이 함수는 단일 세션에서 두 번 이상 호출하여 추가 저장 지점을 만들 수 있습니다. 이러한 저장 지점을 사용하여 데이터베이스 상태에 대한 변경 내용을 선택적으로 유지하거나 삭제할 수 있습니다.

    JET_ERR JET_API JetBeginTransaction(
      __in          JET_SESID sesid
    );

매개 변수

sesid

이 호출에 사용할 세션입니다.

반환 값

이 함수는 다음 반환 코드 중 하나를 사용하여 JET_ERR 데이터 형식을 반환합니다. 가능한 ESE 오류에 대한 자세한 내용은 확장 가능한 스토리지 엔진 오류오류 처리 매개 변수를 참조하세요.

반환 코드

설명

JET_errSuccess

작업이 성공적으로 완료되었습니다.

JET_errClientRequestToStopJetService

JetStopService 호출로 인해 세션과 연결된 instance 모든 작업이 중단되었으므로 작업을 완료할 수 없습니다.

JET_errInstanceUnavailable

세션과 연결된 instance 해당 데이터의 무결성을 보호하기 위해 모든 데이터에 대한 액세스를 해지해야 하는 심각한 오류가 발생하여 작업을 완료할 수 없습니다.

이 오류는 Windows XP 이상 릴리스에서만 반환됩니다.

JET_errNotInitialized

세션과 연결된 instance 아직 초기화되지 않았기 때문에 작업을 완료할 수 없습니다.

JET_errRestoreInProgress

세션과 연결된 instance 복원 작업이 진행 중이므로 작업을 완료할 수 없습니다.

JET_errSessionSharingViolation

동시에 둘 이상의 스레드에 동일한 세션을 사용할 수 없습니다. 이 오류는 Windows XP 이상 릴리스에서만 반환됩니다.

JET_errTermInProgress

세션과 연결된 instance 종료 중이므로 작업을 완료할 수 없습니다.

JET_errTransTooDeep

세션이 데이터베이스 엔진에서 허용하는 최대 저장 지점 깊이에 이미 있으므로 새 트랜잭션을 시작할 수 없습니다.

성공하면 제공된 세션이 트랜잭션 내에 있습니다. 세션이 이전에 트랜잭션 내부에 있었던 경우 새 저장 지점이 만들어집니다.

실패 시 세션의 트랜잭션 상태는 변경되지 않은 상태로 유지됩니다. 데이터베이스 상태는 변경되지 않습니다.

설명

데이터베이스 엔진은 트랜잭션에 대한 스냅샷 격리 모델을 제공합니다. 즉, 세션이 처음 트랜잭션 상태로 전환되면 세션이 트랜잭션 시작 시 시간에 전체 데이터베이스가 고정된 것을 볼 수 있습니다. 세션은 항상 해당 데이터의 적절한 버전에 액세스할 수 있으므로 잠금 데이터를 읽을 필요가 없습니다. 즉, 데이터를 업데이트하는 세션은 다른 세션이 해당 데이터를 읽는 것을 차단하지 않습니다.

스냅샷 격리 사용의 또 다른 의미는 업데이트에 사용되는 잠금 모델입니다. 데이터베이스 엔진은 지정된 데이터 조각에 대한 쓰기 잠금을 요청하는 첫 번째 세션에 부여합니다. 이 쓰기 잠금은 트랜잭션이 커밋되거나 완전히 중단되어 세션이 더 이상 트랜잭션에 있지 않을 때 해제됩니다. 세션이 쓰기 잠금을 보유하는 동안 동일한 쓰기 잠금을 요청하는 다른 세션은 쓰기 잠금을 사용할 수 있을 때까지 차단되지 않습니다. 대신 두 번째 세션은 JET_errWriteConflict 즉시 실패합니다. 이 충돌을 resolve 두 번째 세션은 트랜잭션을 완전히 중단(또는 커밋)하고, 첫 번째 세션이 트랜잭션을 커밋하거나 중단할 때까지 약간의 시간을 기다린 다음, 다시 시작해야 합니다.

스냅샷 격리를 지원하기 위해 데이터베이스 엔진은 모든 세션에서 가장 오래된 활성 트랜잭션이 처음 시작된 시점부터 수정된 모든 데이터의 모든 버전을 메모리에 저장합니다. 이는 애플리케이션에 중요한 영향을 미칩니다. 많은 수의 버전이 메모리에 빌드되는 모든 동작으로 인해 instance 최대 버전 저장소 크기를 소모할 수 있습니다(자세한 내용은 시스템 매개 변수의 JET_paramMaxVerPages 참조). 이러한 동작에는 단일 트랜잭션 및 매우 오래 실행되는 트랜잭션에서 매우 큰 업데이트가 포함되지만 이에 국한되지는 않습니다. 따라서 애플리케이션의 예상 트랜잭션 로드에 대한 버전 저장소 크기를 올바르게 구성하는 것이 매우 중요합니다. 또한 단일 트랜잭션에서 수행되는 업데이트 수를 제한하기 위해 주의해야 합니다. 또한 높은 부하 시나리오에서 트랜잭션을 가능한 한 짧은 기간으로 만드는 것이 중요합니다.

데이터를 검색하거나 업데이트하는 ESE API를 호출할 때 애플리케이션이 항상 트랜잭션 컨텍스트에 있는 것이 좋습니다. 이 작업이 수행되지 않으면 데이터베이스 엔진은 애플리케이션을 대신하여 이 유형의 각 ESE API 호출을 트랜잭션에 자동으로 래핑합니다. 이러한 매우 짧은 트랜잭션의 비용은 경우에 따라 빠르게 추가 될 수 있습니다.

엔진의 기본 동작은 JetBeginTransaction 에 대한 첫 번째 호출이 이루어진 시점부터 JetCommitTransaction 또는 JetRollback 에 대한 일치 호출이 이루어질 때까지 세션을 동일한 스레드로 제한하는 것입니다. JetSetSessionContext 및 JetResetSessionContext를 사용하여 사용자 지정 세션 컨텍스트를 설정하여 이 제한을 제거하도록 이 동작을 변경할 수 있습니다.

데이터베이스 엔진은 트랜잭션 스키마 수정도 지원합니다. 예를 들어 새 트랜잭션을 시작하고, 테이블을 만들고, 몇 개의 열을 추가하고, 인덱스 또는 두 개를 만든 다음, 트랜잭션을 중단할 수 있습니다. 방금 추가된 스키마 요소는 데이터베이스에서 제거됩니다. 동일한 트랜잭션에서 스키마 수정 및 일반 데이터베이스 업데이트를 혼합할 수도 있습니다.

요구 사항

요구 사항

클라이언트

Windows Vista, Windows XP 또는 Windows 2000 Professional이 필요합니다.

서버

Windows Server 2008, Windows Server 2003 또는 Windows 2000 Server가 필요합니다.

머리글

Esent.h에 선언되었습니다.

라이브러리

ESENT.lib를 사용합니다.

DLL

ESENT.dll 필요합니다.

참고 항목

JET_ERR
JET_GRBIT
JET_SESID
JetCommitTransaction
JetGetSystemParameter
JetResetSessionContext
JetRollback
JetSetSessionContext
JetStopService
시스템 매개 변수