4ebdd8ba30ba8e43f83e0acd4c1fa0a14ff7f7a8
insert_use_point, delete_use_point, delete_expire_point 함수의 SELECT-then-UPDATE 패턴이 동시 호출 시 데이터 무결성을 깰 수 있는 race condition을 가지고 있었음. 같은 회원의 포인트 작업이 동시에 발생하면 PHP 단에서 캐시한 잔여량을 기준으로 판단하여 결과적으로 음수/초과 차감 등 포인트가 꼬이는 현상이 발생. MyISAM은 트랜잭션과 FOR UPDATE를 지원하지 않으므로, 락 없이 무결성을 보장하는 lock-free atomic UPDATE 패턴으로 재구현: - 매 단계마다 가장 우선 처리할 행 1개를 SELECT (LIMIT 1) - WHERE 절에 사전 검증 조건(잔여량/상태)을 포함한 원자적 UPDATE - get_sql_affected_rows()로 성공/실패 판별, 실패 시 재시도 - max_iter=1000 안전장치로 무한루프 방지 특징: - 단일 행 차감(가장 흔한 케이스)에서 기존과 동일한 쿼리 수 - GET_LOCK 등 추가 락 없음 → 같은 사용자 동시 요청도 throughput 손실 없음 - MyISAM/InnoDB 모두 호환, MySQL 5.0~8.x 모두 동작
The file is empty.
Languages
PHP
70.9%
JavaScript
16.7%
CSS
7.6%
HTML
4.6%
Python
0.2%