2013-03-29 2 views
1

데이터베이스 테이블의 행이 여러 스레드에서 동시에 업데이트되는 경우 데이터베이스에서 오류를 표시합니다.Java EE 환경에서 낙관적 인 잠금 테스트

프로덕션 환경에는 클러스터에 2 개의 Tomcat 서버가 있습니다. 두 사용자가 각각 Tomcat 서버로 동시에 이동하고 데이터베이스 테이블의 동일한 레코드를 업데이트 할 수도 있습니다. 결과적으로 예외가 발생합니다.

로컬 컴퓨터에서이 상황을 어떻게 시뮬레이트합니까? 아니면 생산과 같은 환경을 어떻게해야할까요? 내가 일하고

기술 : 자바 6, 봄 3, 최대 절전 모드, MS SQL Server 2008 및 데이터베이스 테이블에 행이 여러 스레드가 동시에 업데이트되면 내가 알고있는 것처럼 톰캣 7

+0

ACID 호환 데이터베이스를 사용하는 것이 좋습니다. abt를 많이 염려 할 필요가 없습니다. – Akash

+0

MS SQL Server가 ACID를 준수하지 않는다고 생각합니까? 내 원래 질문은 어떻게 우리가 데이터베이스를 처리하는 경우에도 같은 시나리오를 테스트 할 것입니다. – Raj

+0

미안하지만, 단위 테스트를 위해 MySQL (INNODB를 사용하지 않음)을 사용하고 있었지만 스레드를 여러 번 사용하여 동일한 업데이트 쿼리를 실행 해 볼 수 있습니다. – Akash

답변

0

데이터베이스는 오류를 표시합니다.

반드시 그렇지는 않습니다. 아래 다음과 같은 두 문장을 실행하면

UPDATE foo SET bar=baz WHERE bah=doh; 

데이터베이스는 단순히 이러한 쿼리 또 다른 후 하나를 실행하는 예약 할 수있다. 그러나 plenty of possibilitiesfor a deadlock이 있으며 일반적으로 검색어 및 시간, 데이터 세트 등에 따라 결과가 달라집니다.

+0

좋습니다,하지만 우리는 어떻게 그런 상황을 신뢰할 수있는 단위 테스트합니까? 그리고 나는 교착 상태가 아니라 경쟁 조건에 대해 이야기하고 있습니다. – Raj

+0

경쟁 조건을 시뮬레이트하기 때문에 MS SQL의 버그를 발견 할 수 있다고 생각하십니까? 나는 ** 실제 생활 시나리오 **를 먼저 취하여 거기서 가져갈 것을 제안합니다. 나에게는 존재하지 않는 문제를 해결하고있다. 어쨌든 단위 테스트를 만들고 싶다면 [JDBC interceptor] (http://www.tomcatexpert.com/blog/2010/04/19/building-extensions-jdbc-pool)를 시도해보십시오. 후자는 원하는 방식으로 DB 응답을 모방하도록 프로그래밍 할 수 있습니다. – mindas

+0

나는 아무것도 밝히려고하지 않고있다. 또한 내가 말하는 것은 실제 생활 시나리오입니다. 데이터베이스 테이블의 동일한 행에 대한 동시 다중 업데이트는 모든 클러스터 환경에서 발생할 수 있습니다. 그리고 우리가 그것을 모의 할 수 있다면 당신이 반대하지 않을 것이라고 확신하는 것이 유익 할 것입니다. – Raj

0

시나리오를 시뮬레이션하지 않습니다. 내가 낙관적 인 잠금 예외를 처리하는 코드를 테스트하고자 할 때 읽었다. 나는 단순히 예외를 throw하고 명시 적으로 OptimisticLockException을 throw하는 클래스를 시뮬레이트합니다. 테스트 환경에서 시뮬레이트 된 클래스 내부의 예외 핸들러를 사용하고 테스트 fr 예외 핸들러를 작성한다.

저는 낙관적 잠금이 작동하는지 여부를 테스트하는 것에 대해 걱정하지 않는다고 생각합니다. 그것은 Hibernate 개발자들의 임무이기 때문에.

0

두 가지 트랜잭션을 사용하여 시뮬레이션 할 수 있습니다. 첫 번째 tx를 시작하십시오. 두 번째 tx를 시작하십시오. 첫 번째 TX에서 몇 가지 사항을 변경하고 커밋하십시오. 두 번째 TX에서 몇 가지 사항을 변경하고 커밋하십시오. Hibernate는 OptimisticLockException을 제공해야한다.

관련 문제