2014-05-24 1 views
0

따라서 최대 절전 모드, 스프링, PostgreSQL 및 Quartz를 사용한다.Hibernate, PostgreSQL 및 Quartz를 사용한 동시 트랜잭션

Quartz my은 많은 스레드에서 많은 동시 작업을 수행하므로 각 작업은 일부 데이터를 DB에 삽입하고 트랜잭션으로 처리합니다. 각 행에는 DB 시퀀스에서 가져 오는 직렬 속성이 있습니다.

하나의 작업에 삽입 된 모든 행 (예 : 하나의 트랜잭션)은 순서 (예 : "1,2,3"- 첫 번째 동시 트랜잭션 및 " 4,5,6 "에서 두 번째로). 우리는 두 개 이상의 동시 트랜잭션이 있으면 것을 나는 알고

, - 그들은 숫자가 혼합 얻을 수 있습니다 ...

나는이 문제를 해결 할 수 있습니까?

+0

시퀀스 지정은 무엇입니까? 데이터베이스가 그것을 할당하는 경우 단순히 요청을 수신 한 순서대로 순서를 지정하지 않습니까? 이것이 원하는 것입니까? – sjlevin

+0

두 개의 동시 트랜잭션의 삽입이 혼합되어있을 수 있으므로 첫 번째 트랜잭션은 1,4,5와 두 번째 - 2,3,6을 할당 할 수 있습니다. 나는 이것을 원하지 않는다. –

+1

동시성을 피하기 위해 테이블을 잠글 수 있지만 응용 프로그램이 훨씬 느려집니다. 그런데 왜이 번호들을 신경 쓰나요? 롤백이 끝나면 시퀀스가 ​​롤백되지 않고 번호에 멍청이가 생깁니다. 이 숫자가 얼마나 중요한지, 그것이 무엇을 의미합니까? –

답변

0

프로그래밍 방식으로 시퀀스 생성을 처리해야 할 수도 있습니다. 방법은 시퀀스 테이블을 사용하는 것입니다.

CREATE SEQUENCE my_sequence INCREMENT BY 3 

또는 무엇이든지 작동합니다. 그런 다음 키와 거래 내에서 하나씩 선택합니다.

또는 ThreadLocal을 사용하여 각 스레드에 특정한 값을 얻을 수 있습니다.

int seq = 1; 

private static final ThreadLocal<Integer> sequence = new ThreadLocal<Integer>() { 
    @Override protected Integer initialValue() { 
     return seq+=3; 
    } 
    @Override protected Integer get() { 
     return seq+=3; 
    }  
}; 

그런 다음 각 스레드가 다른 값을 받고 있는지에 대한 걱정없이 각 스레드에 대한 다음 값을 얻기 위해 sequence.get()를 사용할 수 있습니다.