2014-11-14 7 views
0

나는 루프가 동시에 작동하는 약 500 개의 스레드가 있습니다. 모든 루프에서 카운터를 늘리고 싶습니다. 루프동시성 동안 동일한 카운터를 증가하십시오.

마지막 라인 :

update counter_tbl set counter=counter+1 where id = 5; 

그것은 counter의 적어도 두 개의 스레드 획득 한 값이 동일한 값으로 증가하는 것이 가능한가?

예를 들어, 너무 countercounter 51이 51 thread2 업데이트, 업데이트 51 counter thread1 또, 동시에 50 개의 스레드 정확하게 픽업 50이며를 증가시킨다. 그래서 우리는 하나의 증분을 그리워 할 것입니다. 이것이 가능한가? 그렇다면 어떻게 피하는가?

나는 LOCK TABLE을 사용할 수 있지만 그 비용 때문에 나는 그것을 피하고 싶다.

답변

0

실제로는 업데이트 문이므로 트랜잭션으로 실행할 수 없습니다.

잠금 테이블은 두 개의 ore more 문으로 구성된 트랜잭션이있는 경우에만 필요합니다.

0

LOCK TABLE을 사용할 필요가 없습니다. 데이터베이스 서버는 트랜잭션마다 일관 적입니다. 이 경우 쿼리는 하나의 트랜잭션이며 두 스레드가 동일한 레코드를 업데이트하려고하면 데이터베이스 서버가 트랜잭션을 처리합니다. 가능한 경우 트랜잭션은 도착 순서 (또는 서버가 결정한 순서)로 실행되고 그렇지 않으면 교착 상태가 발생합니다 (이 경우 특정 시나리오에서 트랜잭션 을 안전하게 다시 보낼 수 있음)) .