잠금 업그레이드로 야기되는 데이터베이스 교착 상태
잠금 업그레이드로 야기되는 데이터베이스 교착 상태를 방지하기 위해 엔티티 Bean의 액세스 목적 정책을 기본값인 wsPessimisticUpdate-WeakestLockAtLoad에서 wsPessimisticUpdate로 변경하거나 변경이 예상되지 않는 잠금 접근법을 사용할 수 있습니다.
데이터에 동시에 액세스하는 경우, 애플리케이션이 데이터의 무결성을 보장하기 위해 발생해야 하는 데이터베이스 잠금 준비가 되어 있는지 확인하십시오.
엔티티 Bean이 findByPrimaryKey 메소드(데이터베이스에서 기본적으로 얻기 잠금을 확보함)를 수행하고 엔티티 Bean이 동일한 트랜잭션 내에서 업데이트되는 경우, 독점으로 잠금 업그레이드가 발생합니다.
이 시나리오가 다중 스레드에서 동시에 발생하는 경우, 교착 상태가 발생할 수 있습니다. 그 이유는 다중 읽기 잠금은 동시에 확보할 수 있지만 다른 잠금이 제거된 경우에는 하나의 독점 잠금만 확보할 수 있기 때문입니다. 이 시나리오에서는 모든 트랜잭션이 잠금 업그레이드를 시도하기 때문에 하나의 독점 잠금을 확보할 수 없습니다.
이 문제점을 방지하기 위해 엔티티 Bean의 액세스 목적 정책을 기본값인 wsPessimisticUpdate-WeakestLockAtLoad 메소드에서 wsPessimisticUpdate 메소드로 변경할 수 있습니다. 이 변경을 통해 애플리케이션은 트랜잭션이 엔터프라이즈 Bean을 업데이트했음을 제품 및 데이터베이스에 알릴 수 있습니다. 업데이트 잠금이 findByPrimaryKey 메소드에서 즉시 확보됩니다. 이로 인해 나중에 업데이트가 수행될 때 잠금 업그레이드가 방지됩니다.
액세스 목적 정책을 정의하는 선호 기법은 전체 엔티티 Bean의 액세스 목적을 변경하는 것입니다. findByPrimaryKey 메소드의 액세스 목적 정책을 변경할 수 있지만, 이는 버전 6에서는 제공되지 않습니다. 예를 들어, 엔티티 Bean이 읽기 전용인 일부 트랜잭션에 관련된 경우 개별 메소드의 액세스 목적을 변경할 수 있습니다.
대체 기법은 변경이 예상되지 않는 접근법을 사용하는 것으로, 이 접근법에서는 findByPrimaryKey 메소드가 읽기 잠금을 보유하지 않으므로 잠금 업그레이드가 없습니다. 그러나 롤백을 처리하려면 이에 대해 애플리케이션을 코딩해야 합니다. 변경이 예상되지 않는 잠금은 정기적으로 데이터베이스 회선 경합을 예상하지 않는 애플리케이션을 위한 것입니다.
엔티티 Bean의 액세스 목적 정책을 변경하려면 Bean에 액세스 인텐트 정책 적용에 설명된 대로 어셈블리 도구를 사용하여 Bean 레벨을 설정할 수 있습니다.