2009-12-16 7 views
1

우리는 데이터베이스 테이블에서 규칙적인 경합을 경험했으며,이 문제를 해결하기위한 다양한 옵션을 평가하고자합니다.안정적으로 데이터베이스 경합을 재현합니다.

이렇게하려면 반복 가능한 신뢰성을 가진 테이블 (모든 테이블)에서 경합을 테스트 사례에서 재현해야합니다.

내가 생각하는 접근 방식은 잠금의 의미를 바꾸고 (예 : java.util.concurrent.locks.ReentrantLock) 테이블 작성을 시작할 때 잠금을 해제하여 쓰기가 시작될 때 모든 읽기가 수행되도록하는 것입니다.

따라서 하나의 작성자 스레드는 테이블에 삽입하기 직전까지 잠금을 보유한 다음 잠금을 해제 할 때 여러 판독기 스레드가 동일한 테이블에 대해 select 문을 실행하려고합니다.

이러한 접근 방식에 대한 생각이 있었는지 또는 100 % 안정성으로 db 테이블에서 경합을 재현 할 수있는 간단한 접근 방식이 있는지 궁금해하고 있었습니까?

감사

답변

2

당신은 1의 수와 CountDownLatch를 사용할 수 있습니다.

final CountDownLatch barrier = new CountDownLatch(1); 

그런 다음 작가 스레드가

barrier.countDown(); 

어느 시점에서 독자 모두가 즐겁게 멀리 발사 할 수있는 그 첫 번째 작업 독자 스레드, 모든

barrier.await(); 

되어 시작합니다.

+0

멋진 아이디어! 그것에게 탄을주는 .... –

+0

는 매력 같이 작동한다 :-) –

+0

굉장한. 그것을 듣고 기뻐. 답장을 보내 주셔서 감사합니다. –

0

데이터베이스에서 경합을 생성하는 것이 얼마나 쉬운 지에 따라 많은 영향을받습니다. 예를 들어, Oracle을 사용하는 경우 select를 수행하면 결코 경합이 발생하지 않습니다.

데이터베이스에서 경합을 생성하는 가장 쉬운 방법은 업데이트해야하는 행에 대한 읽기를 선택하는 것입니다.

편집 : : 질문을 다시 읽은 후, 데이터베이스에서 "경합"에 대해 신경 쓰는 것처럼 보입니다. 위의 아이디어는 갱신 경합을 강요하지만 독자 경합을 강요하는 데 사용될 수 있습니다.

대량의 독자를 시작하여 데이터베이스에 실제적인 경쟁을 일으키지 않고 기아 만 넘치게하는 select를 사용하여 데이터베이스를 넘치고 싶은 경우 다른 대답에서 언급 한 CountDownLatch를 사용하거나 1.5 이전 JVM에서 강제로 실행되는 경우 Object.wait/Object.notifyAll()을 사용하는 구식 방법.

편집 2 : 주석을 읽은 후,보고있는 경합을 에뮬레이션하는 가장 쉬운 방법은 Sybase lock table command을 사용하는 것입니다. 테이블을 잠그고 셀렉트를 실행 한 다음 테이블 잠금을 해제하면됩니다. 그러면 선택 항목이 모두 실행되어야합니다 ... 이것은 또한 모델링하려는 상황을 가장 정확하게 모방하는 이점이 있습니다.

+0

우리가보고있는 (사이베이스에서) 논쟁은 엄청난 인서트가 많은 인덱스가있는 매우 큰 테이블에 대해 수행되는 경우입니다.삽입이 진행되는 동안 Sybase가 전체 테이블과 인덱스 공간을 잠그는 동안 여러 선택이 대기 상태로 유지됩니다. –

+0

이것은 흥미로운 접근 방법이며, 제가 살펴 보겠습니다. 그러나 우리가 분석하려고하는 부분은 쓰기에 대한 변경이 어떻게 충돌에 영향을 미치는지에 있습니다. 또한 행 레벨 잠금을 사용하는 경우가 많지만 전체 인덱스를 잠그기 때문에 쓰기가 빠르지 만 txn은 인덱스를 업데이트하는 동안 보유 된 잠금에 의해 유지됩니다. –

+0

흠 ... 그냥 내 대답에 대한 자세한 정보를 추가 upvote 잃었어요? –

관련 문제