트랜잭션(Windows 이벤트)

적용 대상: Windows | Windows 서버인

트랜잭션

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

  • 원자성: 트랜잭션의 모든 업데이트는 데이터베이스에 표시 되거나 삭제 됩니다.
  • 일관성: 데이터베이스는 항상 올바른 상태로 시작 되며 항상 다른 유효한 상태로 종료 됩니다. ESE 응용 프로그램의 경우 데이터베이스 엔진은 몇 가지 간단한 제약 조건 (예: 고유 인덱스의 고유성)을 제어 하지만 응용 프로그램 자체는 데이터베이스가 올바른 상태에 있는 것 처럼 거의 모든 다른 요소를 정의 합니다.
  • 격리: 트랜잭션은 다른 세션의 업데이트에서 격리 됩니다. 트랜잭션은 다른 트랜잭션에의 한 변경 내용 중 일부를 표시 하지 않습니다.
  • 내구성: 데이터베이스 엔진은 트랜잭션이 커밋된 것으로 승인 된 후 데이터베이스에서 변경 내용이 영구적으로 적용 됩니다. 트랜잭션의 내구성은 성능상의 이유로 선택적으로 면제 받으려면 수 있습니다.

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

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

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

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

  2. JetMove 를 사용 하 여 원하는 레코드로 커서를 이동 하 여 crowparameter 에 지정 JET_MoveFirst 합니다. 커서를 이동 하는 방법에 대 한 자세한 내용은 테이블의 인덱싱 항목을 참조 하십시오.

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

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

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

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

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

트랜잭션은 서로 중첩 된 JetBeginTransactionJetCommitTransaction 에 대 한 호출을 포함 하는 최대 7 개 수준으로 중첩 될 수 있습니다. 이를 통해 응용 프로그램은 전체 트랜잭션에서 백오프 하지 않고도 트랜잭션의 일부를 롤백할 수 있습니다. JetCommitTransaction 에 대 한 중첩 호출은이 수준의 처리가 완료 되었음을 나타냅니다. 그러나 트랜잭션이 JetCommitTransaction를 사용 하 여 트랜잭션을 커밋하기 위해 가장 외부 호출할 때까지 데이터베이스에 커밋되지 않습니다.

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