2011-11-02 1 views
0

빌딩, 연구 등의 게임 내 이벤트가 포함 된 테이블 events이 있습니다. 각 이벤트의 완료시기는 timestamp입니다. 엔진 : innoDBMySQL 잠금이 올바르게 작동하는지 테스트합니다.

모든 pageload 프로그램은 timestamp이 과거 인 (즉, 이벤트가 완료된) 행에 대해 events 테이블의 빠른 검색을 실행합니다. 이 행을 선택하고 삭제하여 다른 실행이 동일한 이벤트를보고 처리하지 않도록합니다.

두 개의 pagelod가 발생하여 두 개 모두 동일한 행을 읽은 다음 다른 행이 읽힌 행을 삭제할 수있는 기회가 생기면 무슨 일이 벌어 질지 걱정됩니다. 및 삭제.

SET @now=NOW(); 
SELECT * FROM `events` WHERE `timestamp` < @now FOR UPDATE 
DELETE FROM `events` WHERE `timestamp` < @now 

하지만 몇 가지 문제를 테스트하는 데 문제가 있습니다 :

내가 그것을 수정해야 생각하고 같습니다. 이것이 제대로 작동하는지 여부를 테스트하는 방법은 무엇입니까? 여기에 내 자신의 질문에 대답가는

+0

MySQL에서는'NOW()'와 같은 시간 함수가 두 번째에 대해서만 정밀도를 가지기 때문에 이것이 작동하지 않을 것이라고 생각합니다. 몇 초 동안 페이지로드가 밀리 초 단위로 동일하게 발생합니다. – Xint0

+0

괜찮습니다. 이벤트 자체는 두 번째 이벤트에만 정확합니다. 내가 원하는 것은 선택된 행을 잠그는 것이지만, 다른 프로세스가 교착 상태가되는 것을 피하고자합니다. –

답변

0

:

페이지

selectdelete, 동시에 두 개의 통화를 사이에 사용 sleep().

최종 코드 :

START TRANSACTION 
SET @now=NOW() 
SELECT * FROM `events` WHERE `timestamp` < @now FOR UPDATE 
-- SLEEP(5) 
DELETE FROM `events` WHERE `timestamp` < @now 

결과 :

0.000 : 거래
0.001 시작 : 쿼리 실행을, 5 개 행을 반환.
5.002 : 5 행이 삭제되었습니다.
5.008 : 쿼리 실행 0 행을 반환
0.000 :부터 거래
2.562 거래를
===== 두 번째 통화를 종료는 첫 번째 후 몇 초를 시작했다.
2.562 : 0 행이 삭제되었습니다.
2.562 : 거래 종료

잠과 마찬가지입니다. 수면을하지 않으면 0.002 초 이내에 끝납니다.