2013-10-24 2 views
0

카운터 테이블 (SQL 데이터베이스 테이블)SQL 카운터 증가/감소 동기화

CounterID  |CounterValue 
1    |5 
2    |3 

나는 여러 클라이언트가 JDBC를 통해 (& 감소를 증가)이 카운터를 수정/액세스 할 수 있습니다. 카운터를 동 기적으로 처리하는 가장 좋은 방법은 무엇입니까?

현재 클라이언트는 먼저 카운터 값을 선택한 다음 값을 업데이트합니다. 그러나 두 클라이언트가 같은 값을 선택하기 전에 다른 값으로 카운터 값을 업데이트하면 문제가 발생합니다.

상담하십시오. 감사합니다. .

+2

데이터베이스에 시퀀스 (생성자)가있는 경우 대신 이들을 사용하는 것이 좋습니다. –

+0

@MarkRotteveel이 경우, AS400에서 db2를 사용하십시오. 카운터 추가/제거는 자주 발생하며 모든 카운터에 대해 새 시퀀스를 만들 권한이 없습니다. –

답변

1

다음은 각 호출이 고유 한 카운터 값을 갖도록합니다. 자율 트랜잭션으로 실행하십시오.

While (true) do 
    SELECT CounterValue into cv FROM CountersTable WHERE CounterID = 1; 
    UPDATE countertable SET CounterValue = cv+1 WHERE CounterID = 1 and CounterValue = cv; 
    IF (rows updated > 0) THEN 
    COMMIT; 
    EXIT LOOP; --No one else modified the CounterValue 
    END IF 
End do; 
+0

JDBC를 사용하고 있습니다. 거래를 사용할 것을 제안하는 것으로 알고 있습니다. 고마워, 나는 다른 대안을 찾고있다. (왜냐하면 현재 시스템에서 트랜잭션 기반 업데이트를 구현하는 것은 많은 작업입니다.) –

+1

자동 커밋을 사용하고 있다면 내 대답에서 커밋을 제거하면됩니다. –