2016-09-18 1 views
1

트래픽이 많은 콜센터 IVR 시스템을 개발 중입니다. 나는 각 발신자에게 무작위로 무료로 채팅 할 수있는 대표자를주고 싶다.MySQL 블록 특정 행 선택/읽기

무엇 내가 지금 할 것은 :

SELECT admin FROM admins WHERE live = 1 AND available = 1 ORDER BY RAND() LIMIT 1 

내가 무료로 대표를 얻을 후, 내가 너무로 사용할 수없는 그를 업데이트 : 때때로 종료

UPDATE admins SET available = 0 WHERE admin = XXX 

를이 테스트 한 후, 나는 발신자보다 발견 동시에 거의 같은 시간에 전화를하면 같은 시간에 같은 대리인과 상담하십시오.

"FOR UPDATE"를 select 쿼리에 추가하려고했지만 실제로 select 행을 잠그는 데 도움이되지 않습니다.

어떻게이 문제에 접근 할 수 있습니까?

답변

1

이것은 경쟁 조건이라고합니다. 한 가지 방법은 테이블을 잠그는 것이지만, 느리게 할 수 있습니다. 또 다른 아이디어는 동시에 ID를 업데이트를하고 인출하는 것입니다

UPDATE admins 
    SET available = if(@id := admin, 0, 0) 
    WHERE live = 1 AND available = 1 
    ORDER BY RAND() 
    LIMIT 1; 

SELECT @id; 

이 영향을받는 행의 id를 반환합니다.