동시성 제어
동시성 제어는 데이터 자원에 대한 경합 관리입니다. 데이터 액세스 트랜잭션의 초기에 제공된 자원의 잠금을 수행하고 트랜잭션이 닫힐 때까지 이 자원을 해제하지 않을 경우에 동시성 제어 설계는 비관적으로 간주됩니다. 동시성 제어 설계는 잠금이 이루어졌다가 트랜잭션이 끝날 때 짧은 시간 안에 해제될 때 낙관적으로 간주됩니다.
낙관적 동시성은 지정된 자원이 다른 트랜잭션에서 사용될 수 없는 시간을 최소화하기 위해 사용됩니다. 이는 특히 허용될 수 없는 오랜 시간 동안 자원을 잠그는 장기 실행 트랜잭션에서 중요합니다.
낙관적 설계에서 잠금은 읽기 조작 직전에 확보되었다가 그 직후에 즉시 해제됩니다. 업데이트 잠금은 업데이트 조작 직전에 확보되었거나 트랜잭션이 종료될 때까지 유지됩니다.
낙관적 동시성을 사용하기 위해 이 제품은 과규정화 업데이트 설계를 사용하여 현재 트랜잭션 시작 이후에 다른 트랜잭션에서 기본 데이터 소스가 업데이트되었는지를 테스트합니다. 이 설계를 사용하여 업데이트용으로 표시된 열과 해당하는 원래 값은 UPDATE 문의 WHERE 절을 통해 명시적으로 추가되기 때문에 기본 열 값이 변경된 경우에는 명령문이 실패합니다. 따라서 이 설계는 열 레벨의 동시성 제어를 제공할 수 있으며, 비관적 설계는 행 레벨에서만 동시성을 제어할 수 있습니다.
낙관적 설계는 일반적으로 트랜잭션 종료 시에만 이 유형의 테스트를 수행합니다. 기본 열이 트랜잭션 시작 이후에 업데이트되지 않은 경우, CMP(Container Managed Persistence) 필드에 대해 보류 중인 업데이트는 커미트되고 잠금은 해제됩니다. 잠금을 확보할 수 없거나 현재 트랜잭션 이후에 다른 특정 트랜잭션이 열을 업데이트한 경우, 트랜잭션은 롤백되고 트랜잭션 내에서 수행된 모든 작업은 유실됩니다.
비관적 및 낙관적 동시성 설계에서는 서로 다른 트랜잭션 격리 레벨이 필요합니다. 동일한 트랜잭션에 관여하면서 다른 동시성 제어 설계를 요구하는 엔터프라이즈 Bean은 동일한 기본 데이터 연결에서 조작할 수 없습니다.