2012-12-12 2 views
4

MySQL 데이터베이스에 트랜잭션을 저장 날짜를 처리하는 배경실패한 MySQL 쿼리를 다시 시도 하시겠습니까?

내가 PHP` (5.2)에서 페이팔 IPN 핸들러를 가지고있다. 사이트의 활동이 저조합니다.

때때로 MySQL 쿼리가 실패합니다. (매우 드물게) 나는 모든 것을 기록하고 PayPal 메시지를 처리하지 못한 경우 로그 파일을보고 PayPal 메시지를 다시 보낼 수 있습니다.

아이디어/우려

하지만 그 과정이 좀 더 강력하고 대신 핸들러가 포기하기 전에 MySQL의 쿼리를 다시 시도 할 수 있다면 궁금 해서요.

아마도 나는 잠시 기다리고 싶을 것입니다 - 서로간에 즉시 여러 쿼리 시도를 망칠 필요가 없습니다.

나는이에 대한 몇 가지 패턴을 찾을 기대했다 -는 점에서 많은 성공을하지 않고 "PHP는 MySQL의 쿼리 재시도"같은 물건을 찾고.

질문

  1. 이 거기에 좋은 연습 가이드가 있습니까?

  2. 기존 라이브러리는 무엇입니까?

  3. 원치 않는 부작용이 간단한 루프 sleep 각 쿼리 시도 사이의 확인, 또는 캔인가? 너무 원산지? PHP는 세계에서

+1

왜 쿼리 후 오류를 확인하고 true 일 경우 다시 시도하지 않으시겠습니까? 또 다른 방법으로이 쿼리를 "실행 취소"로 표시 한 다음 cron 작업으로 모든 "실행 취소"를 실행하고 몇 분마다 다시 실행합니다. – stasgrin

+0

쿼리가 실패한 직후 다시 시도 하시겠습니까? – thomthom

+0

cron 작업에 관해서는 나머지 트랜잭션의 처리를 다시 시작하는 방법을 만들었습니다. 그것은 단 하나의 쿼리가 아니라 여러 세트와 이전의 데이터에 대한 일부 답장입니다. – thomthom

답변

3

좋은 거래 안전 코드는 규범이 아니라 당신이 Java 또는 .NET 코드 샘플에서 보면 많은 예들이있다. 내가 본

가장 좋은 데이터베이스 코드는 함수에 쿼리를두고 포기 및 로깅/대기 직전에 약 3 번 시도합니다. 다행히 그것이 당신의 문제를 처리 할 것입니다.

모범 사례는 InnoDB의 테이블을 사용하고 커밋 또는 롤백하는 트랜잭션의 모든 중요한 SQL 문을 넣어하는 것입니다. 이렇게하면 특정 쿼리 하나가 실패하더라도 데이터가 일관된 상태가됩니다. (주의하지 않으면 잠금 문제를 복합 할 수 있습니다).

폴링으로 긴 시간을 보내고 싶지 않아 사용자 브라우저가 중단 될 수 있습니다. 구매가 완료되었음을 확인하려면 즉각적인 응답이 필요합니다. 작업을 cron 작업 또는 서버 데몬과 함께 대기열에 넣는 것도 또 다른 방법이지만 사용자에게 즉각적인 피드백을 제공하지는 않으며이 목적을 위해 과도한 작업 일 것입니다.

즉각적인 재 시도가 작동하지 않으면 기본 잠금 문제와 다른 종류가 있습니다. 운동해야하는 불량의 원인입니다.

+0

맞아요, 재미 있어요. 재시도를 구현하는 것이 우수 실행인지 여부는 확실하지 않았습니다. 이 특별한 경우에는 필자가 인간 최종 사용자가 아닌 PayPal의 메시지를 다루고 있습니다. 재시도 시스템을 구현하는 것은 물론, 질의가 때때로 실패 할 수있는 상황에 대해 더 자세히 살펴볼 것입니다. 하드웨어를 직접 호스팅하지 않으므로 환경을 완벽하게 제어 할 수 없습니다. 그래서 내가 할 수 있으면 코드를 좀 더 강력하게 만들고 싶습니다. – thomthom

관련 문제