2009-11-11 5 views
2

동시에 사용하기 위해 트랜잭션 방식 인 서비스 메서드를 테스트해야합니까? (값을 줄임으로써 데이터베이스 행을 업데이트 함)?트랜잭션 서비스 동시 호출 테스트

저는 SpringJunit4ClassRunner로 JUnit 테스트 클래스를 설정했고 컴포넌트는 @autowired입니다.

메서드를 호출하는 스레드를 생성하는 것만으로는 작동하지 않는 것 같습니다. 이것이 Spring 프록시 메커니즘과 관련이 있는지 여부는 확실하지 않습니다.

달성하고자하는 것은 동시에 두 개의 스레드가 테스트 된 메서드의 "내부"에 있고 다른 스레드가 실패하고 롤백하는 상황을 만드는 것입니다. 예 : 행 값은 3이고 두 메소드 호출은 값을 2 씩 줄이려고 시도합니다. 메서드가 작동하지 않으면 값은 -1이되며 이는 잘못된 것입니다. 하지만 두 호출 중 하나가 실패하고 롤백되거나, 다른 호출보다 나중에 즉시 업데이트하려고 시도하는 호출이 실패합니다.

이것도 가능합니까?

+0

스레드를 생성 할 때 제대로 작동하지 않는지를 설명해야합니다. – tangens

+0

나는 callable 메서드의 시작 부분에 nullpointer 예외가있다. (private 메서드 호출 일 뿐이다.) 테이블이 존재하지 않았다고 말하는 예외가있다. 테스트 메서드에서 같은 호출 이후에 이상한 것이었다. t 스레드가 잘 작동했습니다. – egaga

답변

4

첫 번째 문제는 트랜잭션 컨텍스트가 하나의 스레드 (로컬 스레드가 있음)에 바인딩 된 이라는 것입니다. 따라서 각 스레드에서 트랜잭션을 시작해야합니다. (나는 봄이에 대한 지원이없는 생각 당신은 transaction manager와 프로그램 트랜잭션을 시작할 수 있습니다.).

코드 당신 설명 : 읽기, 감소는 쓰기 만 (직렬화하고 반복 우측 격리 수준에서 작동 않습니다 읽기는 효과가있다).

이 설치가 끝나면 데이터베이스 잠금이있는 동안 한 스레드를 차단하여 동작을 테스트 할 수 있습니다. 이 경우 Latch을 사용할 수 있습니다.

데이터베이스 잠금이없는 스레드는 롤백되지 않습니다. 데이터베이스 잠금을 다시 사용할 수있을 때까지 차단됩니다. 설명하는 구성표는 Optimistic concurrency control과 매우 비슷하므로 이미 구현되어 있습니다.

+0

이것은 내가 원했던 것처럼 들린다. 나는 모든 것을 작동시킬 지 지켜 볼 것입니다. 고맙습니다! – egaga