다음을 통해 공유


JetEscrowUpdate 함수

적용 대상: Windows | Windows Server

JetEscrowUpdate 함수

JetEscrowUpdate 함수는 한 열에서 원자성 추가 작업을 수행합니다. 이 함수를 사용하면 여러 세션에서 충돌 없이 동일한 레코드를 동시에 업데이트할 수 있습니다.

    JET_ERR JET_API JetEscrowUpdate(
      __in          JET_SESID sesid,
      __in          JET_TABLEID tableid,
      __in          JET_COLUMNID columnid,
      __in          void* pv,
      __in          unsigned long cbMax,
      __out_opt     void* pvOld,
      __in          unsigned long cbOldMax,
      __out_opt     unsigned long* pcbOldActual,
      __in          JET_GRBIT grbit
    );

매개 변수

sesid

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

tableid

이 호출에 사용할 커서입니다.

columnid

업데이트할 열의 columnid 입니다.

태양광 발전

열에 대한 추가가 포함된 버퍼에 대한 포인터입니다.

cbMax

추가를 포함하는 버퍼의 크기입니다.

pvOld

데이터베이스에 저장된 열의 현재 값을 받을 출력 버퍼입니다(버전 관리가 무시됨).

cbOldMax

열의 현재 값을 받을 출력 버퍼의 최대 크기입니다. 현재는 JET_coltypLong만 지원되므로 버퍼의 길이는 4바이트 또는 0바이트여야 합니다. pvOld가 NULL이면 cbOldMax는 0이어야 합니다.

pcbOldActual

출력 버퍼에서 받은 실제 원시 값 데이터를 받습니다.

grbit

다음 옵션 중 0개 이상을 지정하는 비트 그룹입니다.

의미

JET_bitEscrowNoRollback

에스크로 업데이트를 수행하는 세션에 트랜잭션 롤백이 있더라도 이 업데이트는 실행 취소되지 않습니다. 로그 레코드가 디스크로 플러시되지 않을 수 있으므로 크래시가 발생하면 이 플래그로 수행된 최근 에스크로 업데이트가 손실될 수 있습니다.

반환 값

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

반환 코드

설명

JET_errSuccess

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

JET_errAlreadyPrepared

커서에는 JetPrepareUpdate로 준비된 업데이트가 있습니다.

JET_errClientRequestToStopJetService

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

JET_errInstanceUnavailable

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

JET_errInvalidBufferSize

잘못된 버퍼 크기가 전달되었습니다. 현재는 JET_coltypLong만 지원되므로 버퍼는 4바이트여야 합니다.

JET_errInvalidOperation

잘못된 열이 지정되었습니다. 열을 지정한 JET_bitColumnEscrowUpdate 만들어야 합니다. JET_coltypLong 고정 열만 업데이트 가능한 에스크로로 지정할 수 있습니다.

JET_errNoCurrentRecord

열을 업데이트하려면 커서가 레코드에 있어야 합니다.

JET_errNotInTransaction

에스크로 업데이트는 트랜잭션의 세션에서만 수행할 수 있습니다.

JET_errNotInitialized

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

JET_errPermissionDenied

커서는 레코드만 읽고 업데이트할 수 없습니다.

JET_errRestoreInProgress

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

JET_errSessionSharingViolation

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

JET_errTermInProgress

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

JET_errTransReadOnly

세션에는 레코드를 업데이트할 수 있는 쓰기 권한이 있어야 합니다.

JET_errWriteConflict

충돌하는 업데이트가 요청되면 반환되는 오류입니다.

설명

일반적으로 두 세션에서 레코드를 동시에 업데이트하려고 하면 세션이 완전히 직렬화되지 않는 한 두 번째 세션에서 JET_errWriteConflict 오류가 발생합니다. 동일한 레코드를 업데이트하는 두 세션을 직렬화하려면 첫 번째 트랜잭션이 트랜잭션을 커밋한 후 두 번째 세션이 해당 트랜잭션을 시작해야 합니다. 자세한 내용은 JetBeginTransaction 을 참조하세요.

동일한 레코드의 여러 열을 에스크로 업데이트할 수 있습니다. 업데이트는 서로 영향을 미치지 않습니다.

JetEscrowUpdate 작업만 서로 호환됩니다. 서로 다른 두 세션에서 업데이트를 준비하거나 동일한 레코드를 삭제하려고 하면 쓰기 충돌이 생성됩니다.

세션 B
JetEscrowUpdate

JetPrepareUpdate

JetDelete

JetEscrowUpdate

JET_errSuccess

JET_errWriteConflict

JET_errWriteConflict

JetUpdate

JET_errWriteConflict

JET_errWriteConflict

JET_errWriteConflict

세션 A

JetDelete

JET_errWriteConflict

JET_errWriteConflict

JET_errWriteConflict

Escrow 작업은 버전이 지정되고 JetRollback 을 사용하여 실행 취소됩니다(JET_bitEscrowNoRollback 지정되지 않은 경우). JetEscrowUpdate 는 애플리케이션이 sentinel 값이 적중될 때 특수 작업을 수행할 수 있으므로 데이터베이스에 저장된 열의 원시 값을 반환합니다. JetRetrieveColumn 은 동시 세션에 의한 업데이트를 무시하고 열의 올바른 버전 보기를 반환합니다.

동일한 레코드의 동일한 열에서 작동하는 두 세션이 있는 경우 어떻게 작동하는지 확인할 수 있습니다. 열이 값 0으로 시작한다고 가정합니다.

세션

작업

저장된 값

반환 값

A

JetBeginTransation

A

JetBeginTransation

0

A

JetEscrowUpdate (4)

4

0

A

JetRetrieveColumn

4

b

JetBeginTransaction

b

JetRetrieveColumn

0

b

JetEscrowUpdate (3)

7

4

b

JetRetrieveColumn

3

A

JetEscrowUpdate (2)

9

7

A

JetEscrowUpdate (-7)

2

9

b

JetRetrieveColumn

3

A

JetRetrieveColumn

-1

b

JetRollback

-1

A

JetRetrieveColumn

-1

에스크로 업데이트를 수행하는 동일한 트랜잭션의 레코드를 레코드로 바꾸는 것은 권장되지 않습니다. 특히 레코드에 대한 업데이트가 하나의 JET_TABLEID 준비되고 레코드를 에스크로 업데이트하는 데 다른 JET_TABLEID 사용되는 경우 JetUpdate 가 호출될 때 업데이트된 에스크로가 손실됩니다. 업데이트 중에 에스크로 열이 설정되지 않은 경우에도 이 오류가 발생합니다.

에스크로 업데이트 가능한 열의 값이 0이면 특수 동작을 트리거할 수 있습니다. 이 동작 은 JetEscrowUpdate 작업으로 인해 열 값이 0인 경우에만 발생합니다. 작업은 즉시 수행되지 않지만 트랜잭션 이후에 발생하므로 열에 커밋 값이 0이 됩니다. 열의 값은 0이어야 합니다(즉, 다른 세션이 열을 수정하지 않은 경우). JET_bitColumnDeleteOnZero 사용하여 열을 만든 경우 열이 포함된 레코드가 삭제됩니다. JET_bitColumnFinalize 사용하여 열을 만든 경우 콜백이 발급됩니다. 충돌이 발생하면 이러한 작업이 발생하지 않을 수 있지만 온라인 유지 관리( JetDefragment 함수 사용)는 작업을 올바르게 다시 실행합니다.

요구 사항

요구 사항

클라이언트

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

서버

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

머리글

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

라이브러리

ESENT.lib를 사용합니다.

DLL

ESENT.dll 필요합니다.

참고 항목

JET_COLUMNID
JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JetBeginTransaction
JetDefragment
JetPrepareUpdate
JetRetrieveColumn
JetRollback
JetStopService
JetUpdate