Google 또는 스택 오버플로를 사용하여 이에 대한 대답을 찾는 데 어려움을 겪고 있으므로 Percona XtraDB에 익숙한 사람들이 이에 대한 답변을 얻을 수 있습니다. 필자는이 기사에 설명 된대로 예기치 않은 교착 상태가 발생할 수있는 방법을 완전히 이해했으며 해결 방법은 재시도 논리로 트랜잭션을 래핑하여 실패 할 경우 다시 시작할 수 있도록하는 것입니다. 우리는 이미 그렇게합니다.Percona XtraDB 트랜잭션 외부에서 다중 노드 쓰기 및 예기치 않은 교착 상태가 발생합니까?
내 질문은 외부 자동으로 트랜잭션의 발생 커밋 모드 정상 업데이트에 관한 것입니다. 일반적으로 단일 SQL DB에만 작성하고 업데이트를 수행하는 경우 최종 승계 시나리오가 생기므로 문장을 마지막으로 실행하는 사람은 누구나 황금색입니다. 다른 데이터는 손실되므로 두 개의 업데이트가 동시에 발생하면 그 중 하나가 보류되고 다른 데이터는 본질적으로 손실됩니다.
이제는 동일한 마스터 환경에서 어떻게됩니까? 다중 마스터와의 클러스터 모드의 차이점은 잠금이 테이블에서 처음 수행 될 때가 아니라 커밋이 발생하는 지점에서 교착 상태가 발생할 수 있다는 것입니다. 따라서 자동 커밋 모드에서는 데이터가 DB에 기록되지만 다른 것이 동일한 정확한 레코드를 동시에 수정하면 클러스터의 다른 노드에 커밋하려고 할 때 실패 할 수 있습니다. 분명히 간단한 해결책은 업데이트를 다시 실행하는 것입니다. 자동 커밋 모드의 단일 명령문이므로 데이터베이스 자체에서이를 처리 할 수 있어야합니다.
그래서이 시나리오에서 어떤 일이 발생합니까? 또는 다시 시도 할 때 모든 업데이트 코드를 래핑하고이를 실패 할 때 직접 다시 시도해야합니까?
수동 트랜잭션에 대한 전체 랩핑 재시도 처리가 이미 필요합니다 (제대로 작동하려면 꽤 필요합니다). 자동 커밋 트랜잭션이 실패할지 여부는 내 질문에 달려 있습니다. 생각하고있는 상황은 두 노드가 동시에 같은 레코드에서 트랜잭션을 수행하려고 할 때입니다. 노드 1은 완료되고 노드 2는 별도로 완료되지만 복제 할 때 그 중 하나가 실패해야합니까? 그렇다면 PXC 자동으로 실패한 자동 커밋을 시도합니까? –
예, 자동 커밋 트랜잭션도 실패 할 수 있습니다. 그들은 afterall 거래입니다. 자동 커밋 = 0 또는 = 1이면 아무런 차이가 없습니다. "노드 2가 별도로 완료됩니다"라는 문장이 잘못되었습니다. 귀하의 예제에서 노드 2는 커밋을 완료하지 않을 것입니다. 커미트가 발생하기 전에 인증이 발생하므로 노드 2는 커밋시 오류를 수신합니다. 노드 1은 커밋 프로세스를 수행합니다. 여기에는 쓰기 세트를 모든 노드 (자체 포함)에 복제하고 인증하는 작업이 포함됩니다. 그런 다음 실제 온 - 디스크 커밋이 발생합니다. 커밋시 노드 2 또한 복제하여 로컬에서 인증하려고 시도하지만 실패하면 실패합니다. – utdrmac
나는 결코 실패하지 않을 것이라고 말했다. 나는 그것이 실패 할 것을 안다; 문제는 데이터베이스가 자동 커밋 모드에서 실패 할 경우 자동으로 트랜잭션을 다시 시도 할 것인가? –