문제

PHP와 MySQL을 사용하여 2 단계 커밋을 구현하려고 노력하고 있으며 짧게 나타납니다.

내가 찾은 메인 블록은 MySQL 연결 자원을 두 번째 단계에서 다시 찾을 수있는 장소에 저장할 수 없다는 것입니다. 데이터베이스 핸들을 직렬화 할 수 있습니까?

다음은 코드를 코딩하려는 경우입니다.

  1. 사용자는 데이터를 보냅니다
  2. 서버는 MySQL 트랜잭션을 시작하고 수신 한 데이터에 따라 일부 쿼리를 실행합니다.
  3. 서버는 파일을 사용자에게 다시 보냅니다
  4. 사용자가 파일을 성공적으로 받으면 서버는 트랜잭션을 저지른다. 그렇지 않으면 다시 굴립니다.

이를 위해서는 두 개의 HTTP 요청/응답주기가 필요한 것으로 보이므로 트랜잭션을 커밋하려면 두 번째 요청에서 동일한 데이터베이스 핸들에 다시 연결할 수 있어야합니다. 나는이 부분에서 실패했다.

"이것은 PHP에서 불가능하다"라도 조언을 환영합니다.

도움이 되었습니까?

해결책

Lixa Transaction Manager (http://lixa.sourceforge.net/)를 살펴보십시오.

분산 트랜잭션 처리 및 2 단계 커밋 기능도 제공합니다.

문안 인사

ch. 에프.

다른 팁

PHP는 요청 / 응답이므로 지속적인 DB 연결의 구현은 AFAIK가 아닙니다.

일종의 발권 메커니즘을 사용 하여이 한계를 해결하려고 시도 할 수 있습니다. 당신의 단계는 다음과 같습니다.

  1. 사용자는 데이터를 보냅니다
  2. 서버는 MySQL 트랜잭션을 시작하고 수신 한 데이터에 따라 일부 쿼리를 실행하여 해당 트랜잭션에 '고유 한'티켓을 할당합니다.
  3. 서버는 파일과 티켓을 사용자에게 돌려 보냅니다.
  4. 사용자가 파일을 성공적으로 받고 해당 티켓이 포함 된 다른 요청을 보냈을 때 서버는 거래를 저지른다. 그렇지 않으면 다시 굴립니다.
  5. Cassy의 의견 참조 : 일정 기간이 지나면 DB가 오래된 거래로 '홍수'를 막지 않도록 TAS를 롤백해야합니다.

HTH

KB22와 Rojoca에 답하기 위해, 내가 이런 식으로 해야하는 이유는 내가 참조하는 '파일'이 실제로 모바일 장치의 데이터 저장소로 끝나는 SQLITE 데이터베이스이기 때문입니다.

첫 번째 요청은 업데이트 된 SQLITE 데이터베이스를 서버에 게시하여 SQLITE 테이블의 데이터를 병합하려고합니다. 모바일 장치가 새로운 SQLITE 데이터베이스 (모바일 장치의 변경 사항 및 웹 응용 프로그램의 기타 새로운 제품을 반영하는)를 성공적으로 수신하지 않으면 문제가 발생합니다. 그런 다음 동일한 (이전) SQLITE 데이터베이스를 웹 테이블에 두 번째로 웹 테이블의 항목이 모바일 장치에서 생성 된 내용에 대한 중복 항목을 초래합니다.

따라서 웹은 병합 변경을 커밋하기 전에 장치에 새 데이터베이스가 있는지 확인해야합니다. 네트워크의 질적 인 경우, 새로운 SQLITE 데이터베이스를 수신 한 후 장치가 명시 적 ACK를 보낼 수있는 경우에만 가능해 보입니다. 그리고 이것은 우리가 두 개의 요청을하는 경우에만 가능합니다 (1. 병합하기 위해 SQLITE 데이터베이스; 2. 장치에서 새 SQLITE 데이터베이스를 수신 한 ACK).

실제로 가시적인 문제는 PHP가 데이터베이스를 조작 할 수 없다는 것을 알게되어 유용한 정보입니다.

또한 '실제'웹 데이터베이스 테이블을 기반으로 장치에 데이터를 반환해야하기 때문에 트랜잭션 테이블을 사용할 수 있다고 생각하지 않습니다. 실제 테이블을 사용하지 않으면 Auto_Increment 필드와의 문제가 발생할 것이라고 생각합니다.

모든 의견에 감사드립니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top