동시성 제어 이해
동시성 제어는 여러 사용자가 동시에 행을 업데이트할 때 데이터베이스의 무결성을 유지하기 위해 사용되는 다양한 기술을 나타냅니다. 동시성이 잘못되면 더티 읽기, 가상 읽기, 반복할 수 없는 읽기 등의 문제가 발생할 수 있습니다. Microsoft JDBC Driver for SQL Server는 이러한 문제를 해결하기 위해 SQL Server에서 사용하는 모든 동시성 기술에 인터페이스를 제공합니다.
참고 항목
SQL Server 동시성에 대한 자세한 내용은 "동시 데이터 액세스 관리"를 참조하세요.
설명
JDBC 드라이버는 다음 동시성 유형을 지원합니다.
동시성 유형 | 특성 | 행 잠금 | 설명 |
---|---|---|---|
CONCUR_READ_ONLY | 읽기 전용 | 아니요 | 커서를 통한 업데이트는 지원되지 않으며 결과 집합을 구성하는 행에 대해 잠금이 보유되지 않습니다. |
CONCUR_UPDATABLE | 낙관적 읽기/쓰기 | 아니요 | 데이터베이스에서 행 경합이 발생할 가능성이 높진 않지만 있다고 간주합니다. 타임스탬프 비교로 행 무결성을 검사합니다. |
CONCUR_SS_SCROLL_LOCKS | 비관적 읽기/쓰기 | 예 | 데이터베이스에서 행 경합이 발생할 가능성이 있다고 간주합니다. 행 잠금 없이 행 무결성이 보장됩니다. |
CONCUR_SS_OPTIMISTIC_CC | 낙관적 읽기/쓰기 | 아니요 | 데이터베이스에서 행 경합이 발생할 가능성이 높진 않지만 있다고 간주합니다. 타임스탬프 비교로 행 무결성을 확인합니다. SQL Server 2005(9.x) 이상의 경우 테이블에 타임스탬프 열이 없으면 서버에서 이를 CONCUR_SS_OPTIMISTIC_CCVAL로 변경합니다. SQL Server 2000(8.x)의 경우 기본 테이블에 타임스탬프 열이 있으면 OPTIMISTIC WITH VALUES를 지정해도 OPTIMISTIC WITH ROW VERSIONING이 사용됩니다. OPTIMISTIC WITH ROW VERSIONING을 지정하고 테이블에 타임스탬프가 없는 경우 OPTIMISTIC WITH VALUES가 사용됩니다. |
CONCUR_SS_OPTIMISTIC_CCVAL | 낙관적 읽기/쓰기 | 아니요 | 데이터베이스에서 행 경합이 발생할 가능성이 높진 않지만 있다고 간주합니다. 행 데이터 비교로 행 무결성을 검사합니다. |
업데이트할 수 없는 결과 집합
업데이트할 수 있는 결과 집합은 행을 삽입, 업데이트 및 삭제할 수 있는 결과 집합입니다. 다음 경우 SQL Server는 업데이트 가능한 커서를 만들 수 없습니다. 생성된 예외는 "결과 집합을 업데이트할 수 없습니다."입니다.
원인 | 설명 | 해결 방법 |
---|---|---|
JDBC 2.0 이상 구문을 사용하여 문을 만들지 않습니다 | JDBC 2.0에서는 문을 만드는 새로운 메서드를 도입했습니다. JDBC 1.0 구문을 사용하는 경우 결과 집합은 기본적으로 읽기 전용으로 설정됩니다. | 문을 만들 때 결과 집합 형식 및 동시성을 지정합니다. |
문은 TYPE_SCROLL_INSENSITIVE를 사용하여 생성됩니다 | SQL Server는 정적 스냅샷 커서를 만듭니다. 이 커서는 다른 사용자가 행을 업데이트하지 못하도록 커서를 보호하기 위해 기본 테이블 행과의 연결을 끊습니다. | 정적 커서를 만들지 않도록 CONCUR_UPDATABLE과 함께 TYPE_SCROLL_SENSITIVE, TYPE_SS_SCROLL_KEYSET, TYPE_SS_SCROLL_DYNAMIC, 또는 TYPE_FORWARD_ONLY를 사용합니다. |
테이블 디자인은 KEYSET 또는 DYNAMIC 커서를 배제합니다 | SQL Server에서 행을 고유하게 식별할 수 있도록 하는 고유 키가 기본 테이블에 없습니다. | 테이블에 고유 키를 추가하여 각 행의 고유 ID를 제공합니다. |