낙관적 동시성
낙관적 동시성은 트랜잭션 간의 충돌이 거의 발생하지 않는다는 낙관적 가정에서 해당 이름을 파생합니다. 다른 트랜잭션이 현재 트랜잭션에서 읽은 시간과 업데이트 또는 삭제된 시간 사이에 데이터 행을 업데이트하거나 삭제할 때 충돌이 발생했다고 합니다. 애플리케이션 개발자가 이러한 충돌이 일반적이라고 생각하는 비관적 동시성 또는 잠금과는 반대입니다.
낙관적 동시성에서는 행을 업데이트하거나 삭제할 때까지 행의 잠금이 해제된 상태로 남아 있습니다. 이때 행이 다시 읽혀지고 검사 마지막으로 읽은 이후 변경되었는지 확인합니다. 행이 변경되면 업데이트 또는 삭제가 실패하고 다시 시도해야 합니다.
행이 변경되었는지 여부를 확인하기 위해 새 버전은 캐시된 행 버전에 대해 검사. 이 검사 SQL Server의 타임스탬프 열 또는 행의 각 열 값과 같은 행 버전을 기반으로 할 수 있습니다. 대부분의 DBMS는 행 버전을 지원하지 않습니다.
낙관적 동시성은 데이터 원본 또는 애플리케이션에서 구현할 수 있습니다. 두 경우 모두 애플리케이션은 커밋된 읽기와 같은 낮은 트랜잭션 격리 수준을 사용해야 합니다. 더 높은 수준을 사용하면 낙관적 동시성을 사용하여 얻은 증가된 동시성을 부정합니다.
데이터 원본에서 낙관적 동시성을 구현하는 경우 애플리케이션은 SQL_ATTR_CONCURRENCY 문 특성을 SQL_CONCUR_ROWVER 또는 SQL_CONCUR_VALUES 설정합니다. 행을 업데이트하거나 삭제하려면 비관적 동시성과 마찬가지로 배치된 업데이트 또는 삭제 문을 실행하거나 SQLSetPos를 호출합니다. 드라이버 또는 데이터 원본은 충돌로 인해 업데이트 또는 삭제가 실패하면 SQLSTATE 01001(커서 작업 충돌)을 반환합니다.
애플리케이션 자체가 낙관적 동시성을 구현하는 경우 SQL_ATTR_CONCURRENCY 문 특성을 SQL_CONCUR_READ_ONLY 설정하여 행을 읽습니다. 행 버전을 비교하고 행 버전 열을 모르는 경우 SQL_ROWVER 옵션을 사용하여 SQLSpecialColumns를 호출 하여 이 열의 이름을 확인합니다 .
애플리케이션은 SQL_CONCUR_LOCK 동시성을 높이고(행에 대한 쓰기 액세스 권한을 얻기 위해) 애플리케이션이 행을 읽을 때 가진 버전 또는 값을 지정하는 WHERE 절을 사용하여 UPDATE 또는 DELETE 문을 실행하여 행을 업데이트하거나 삭제합니다. 그 이후로 행이 변경되면 문이 실패합니다. WHERE 절이 행을 고유하게 식별하지 않는 경우 문은 다른 행을 업데이트하거나 삭제할 수도 있습니다. 행 버전은 항상 행을 고유하게 식별하지만 행 값은 기본 키를 포함하는 경우에만 행을 고유하게 식별합니다.