>데이터 베이스 >MySQL 튜토리얼 >MySQL 온라인 사용자 추적 시스템에서 '잠금을 시도할 때 교착 상태 발견' 오류를 방지하려면 어떻게 해야 합니까?

MySQL 온라인 사용자 추적 시스템에서 '잠금을 시도할 때 교착 상태 발견' 오류를 방지하려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-15 18:52:15313검색

How Can I Prevent

MySQL에서 '잠금을 가져오려고 할 때 발견된 교착 상태' 방지

문제:

개발자는 간헐적으로 '잠금을 시도할 때 교착 상태가 발견되었습니다. 온라인 사용자 활동을 추적하는 InnoDB 테이블에 INSERT를 실행할 때 '트랜잭션 다시 시작' 오류가 발생합니다. 테이블은 페이지 새로 고침 시 업데이트되고 cron 작업에 의해 15분마다 지워집니다.

문제의 쿼리:

  • 첫 번째 방문: INSERT INTO onlineusers(ip , 날짜시간, 사용자 ID, 페이지, 지역, 유형) VALUES (ip, now(), 사용자 ID, '/thispage', 'thisarea', 3)
  • 페이지 새로고침: UPDATE onlineusers SET ip = ip, datetime = now(), userid = userid, page = '/thispage', Area = 'thisarea', type = 3 WHERE id = 888
  • 15분마다 크론 작업: DELETE FROM onlineusers WHERE datetime <= now() - 간격 900초

해결책:

교착 상태를 해결하려면 트랜잭션에서 키를 일관된 순서로 잠그는 것이 중요합니다. 권장 단계는 다음과 같습니다.

  1. 쿼리의 키 순서:

    • 여러 키를 잠그는 모든 쿼리가 오름차순으로 수행되는지 확인하세요. 에 대한 주문 키.
  2. 삭제 문 정렬:

    • 기본 키 값을 검색하는 하위 쿼리를 포함하도록 DELETE 문을 수정합니다. (이 경우에는 id)를 오름차순으로 정렬합니다. 이:
    DELETE FROM onlineusers
    WHERE id IN (
        SELECT id
        FROM onlineusers
        WHERE datetime <= now() - INTERVAL 900 SECOND
        ORDER BY id
    ) u;
  3. 재시도 메커니즘:

    • 이 특정 항목에 대해 클라이언트 코드에 재시도 메커니즘을 구현하는 것을 고려하세요. 오류가 발생하여 제한된 횟수만큼 자동으로 재시도할 수 있습니다. 번.

위 내용은 MySQL 온라인 사용자 추적 시스템에서 '잠금을 시도할 때 교착 상태 발견' 오류를 방지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.