예: 읽기 전용 일관성 검사
읽기 전용 일관성 검사는 데이터를 다른 트랜잭션에서 읽는 LifeTimeInCache Bean에만 적용합니다.
사용법 시나리오
RR(repeatable read)을 위한 액세스 인텐트의 경우, 이는 제품이 데이터가 데이터 저장소의 데이터와 일치되는지 검사하고 검사 후 업데이트하지 않았다는 것을 확인함을 의미합니다. RC(read committed)를 위한 액세스 인텐트의 경우, 제품은 데이터가 검사 시점에서 일치하는지 검사하지만 검사 후 데이터가 변경되지 않음을 보증하지 않음을 의미합니다. LifeTimeInCache Bean의 동작을 비-LifeTimeInCache Bean과 동일하게 만듭니다.
"Ann" 은행 계정의 이자 계산에 관한 다음 시나리오에서 표시된 대로 일관성 검사 설정을 위한 세 옵션이 있습니다. 각각의 경우, 데이터 저장소는 이 EJB(Enterprise JavaBeans) CMP(Container Managed Persistence) 애플리케이션에서 공유되어 EJB BMP(Bean Managed Persistence) , JDBC(Java Database Connectivity) 또는 레거시 애플리케이션과 같은 이자 및 기타 애플리케이션을 계산합니다. 각각의 경우에도 EJB 계정은 수명이 긴 Bean으로 구성됩니다.
NONE
- 서버가 시작됩니다.
- 트랜잭션 1의 사용자 1은 Account.findByPrimaryKey("10001")을 호출하며, Ann에 대한 계정 데이터는 $100의 잔고로 데이터베이스에서 읽힙니다.
- Ann의 레코드는 서버의 PM(Persistence Manager)에서 캐시됩니다.
- 사용자 2는 JDBC 호출을 쓰고 잔고를 $120로 변경합니다.
- 트랜잭션 2의 사용자 3은 계정 "10001"에 대해 Account.findByPrimaryKey()를 호출하며, Ann의 데이터는 $100의 잔고로 캐시에서 읽힙니다.
- Ann의 이자를 계산하지만 데이터 무결성 문제 때문에 결과가 올바르지 않을 수 있습니다.
읽기 전용 검사 AT_TRAN_BEGIN
- 서버가 시작됩니다.
- 트랜잭션 1의 사용자 1은 Account.findByPrimaryKey("10001")을 호출하며, Ann에 대한 계정 데이터는 $100의 잔고로 데이터베이스에서 읽힙니다.
- Ann의 레코드는 서버의 PM(Persistence Manager)에서 캐시됩니다.
- 사용자 2는 JDBC 호출을 쓰고 잔고를 $120로 변경합니다.
- 트랜잭션 2의 사용자 3은 계정 "10001"에 대해 Account.findByPrimaryKey()를 호출하며, Ann의 데이터는 $100의 잔고로 캐시에서 읽힙니다.
- PM은 Ann의 계정에서 읽기 전용 검사를 수행하며 100의 잔고가 변경됨을 발견합니다. 데이터베이스 조회를 실행하여 $120의 잔고를 검색하며, 캐시에서 Ann의 데이터가 새로 고쳐집니다.
- Ann의 이자를 계산하고, 데이터 무결성이 보호되기 때문에 트랜잭션으로 진행합니다.
읽기 전용 검사 AT_TRAN_END
- 서버가 시작됩니다.
- 트랜잭션 1의 사용자 1은 Account.findByPrimaryKey("10001")을 호출하며, Ann에 대한 계정 데이터는 $100의 잔고로 데이터베이스에서 읽힙니다.
- Ann의 레코드는 서버의 PM(Persistence Manager)에서 캐시됩니다.
- 사용자 2는 JDBC 호출을 쓰고 잔고를 $120로 변경합니다.
- 트랜잭션 2의 사용자 3은 계정 "10001"에 대해 Account.findByPrimaryKey()를 호출하며, Ann의 데이터는 $100의 잔고로 캐시에서 읽힙니다.
- Ann의 이자를 계산합니다.
- 트랜잭션 2의 종료 중, PM은 Ann의 계정에서 읽기 전용 검사를 수행하며 100의 잔고가 변경됨을 발견합니다.
- PM은 트랜잭션을 롤백하고 캐시를 무효화합니다. 트랜잭션이 실패하고 다시 데이터 무결성이 보호됩니다.