동시성 제어

동시성은 두 트랜잭션이 동시에 동일한 데이터를 사용할 수 있는 기능이며, 트랜잭션 격리가 증가하면 일반적으로 동시성이 감소합니다. 이는 일반적으로 행 잠금을 통해 트랜잭션 격리를 구현하고, 더 많은 행이 잠겨 있으므로 잠긴 행에 의해 최소한 일시적으로 차단되지 않고 더 적은 트랜잭션을 완료할 수 있기 때문입니다. 동시성 감소는 일반적으로 데이터베이스 무결성을 기본 데 필요한 더 높은 트랜잭션 격리 수준에 대한 장단점으로 받아들여지지만 커서를 사용하는 읽기/쓰기 작업이 많은 대화형 애플리케이션에서 문제가 될 수 있습니다.

예를 들어 애플리케이션이 SQL 문 SELECT * FROM Orders를 실행한다고 가정합니다. SQLFetchScroll을 호출하여 결과 집합을 스크롤하고 사용자가 주문을 업데이트, 삭제 또는 삽입할 수 있도록 합니다. 사용자가 주문을 업데이트, 삭제 또는 삽입한 후 애플리케이션은 트랜잭션을 커밋합니다.

격리 수준이 반복 가능한 읽기인 경우 트랜잭션은 구현 방법에 따라 SQLFetchScroll에서 반환된 각 행을 잠글 수 있습니다. 격리 수준이 Serializable이면 트랜잭션이 전체 Orders 테이블을 잠글 수 있습니다. 두 경우 모두 트랜잭션은 커밋되거나 롤백될 때만 잠금을 해제합니다. 따라서 사용자가 주문을 읽는 데 많은 시간을 할애하고 주문을 업데이트, 삭제 또는 삽입하는 데 시간이 거의 걸리지 않으면 트랜잭션이 많은 행을 쉽게 잠글 수 있으므로 다른 사용자가 사용할 수 없게 됩니다.

커서가 읽기 전용이고 애플리케이션에서 사용자가 기존 주문만 읽을 수 있는 경우에도 문제가 됩니다. 이 경우 애플리케이션은 트랜잭션을 커밋하고, SQLCloseCursor(자동 커밋 모드) 또는 SQLEndTran(수동 커밋 모드)을 호출할 때 잠금을 해제합니다.

이 섹션에서는 다음 항목을 다룹니다.