2016-06-08 6 views
0

Google 또는 스택 오버플로를 사용하여 이에 대한 대답을 찾는 데 어려움을 겪고 있으므로 Percona XtraDB에 익숙한 사람들이 이에 대한 답변을 얻을 수 있습니다. 필자는이 기사에 설명 된대로 예기치 않은 교착 상태가 발생할 수있는 방법을 완전히 이해했으며 해결 방법은 재시도 논리로 트랜잭션을 래핑하여 실패 할 경우 다시 시작할 수 있도록하는 것입니다. 우리는 이미 그렇게합니다.Percona XtraDB 트랜잭션 외부에서 다중 노드 쓰기 및 예기치 않은 교착 상태가 발생합니까?

https://www.percona.com/blog/2012/08/17/percona-xtradb-cluster-multi-node-writing-and-unexpected-deadlocks/

내 질문은 외부 자동으로 트랜잭션의 발생 커밋 모드 정상 업데이트에 관한 것입니다. 일반적으로 단일 SQL DB에만 작성하고 업데이트를 수행하는 경우 최종 승계 시나리오가 생기므로 문장을 마지막으로 실행하는 사람은 누구나 황금색입니다. 다른 데이터는 손실되므로 두 개의 업데이트가 동시에 발생하면 그 중 하나가 보류되고 다른 데이터는 본질적으로 손실됩니다.

이제는 동일한 마스터 환경에서 어떻게됩니까? 다중 마스터와의 클러스터 모드의 차이점은 잠금이 테이블에서 처음 수행 될 때가 아니라 커밋이 발생하는 지점에서 교착 상태가 발생할 수 있다는 것입니다. 따라서 자동 커밋 모드에서는 데이터가 DB에 기록되지만 다른 것이 동일한 정확한 레코드를 동시에 수정하면 클러스터의 다른 노드에 커밋하려고 할 때 실패 할 수 있습니다. 분명히 간단한 해결책은 업데이트를 다시 실행하는 것입니다. 자동 커밋 모드의 단일 명령문이므로 데이터베이스 자체에서이를 처리 할 수 ​​있어야합니다.

그래서이 시나리오에서 어떤 일이 발생합니까? 또는 다시 시도 할 때 모든 업데이트 코드를 래핑하고이를 실패 할 때 직접 다시 시도해야합니까?

답변

0

자동 커밋은 여전히 ​​트랜잭션입니다. 단일 명세서 거래. 귀하의 단일 진술은 단지 BEGIN/COMMIT에 싸여 있습니다. 나는 당신의 논리가 뒤바뀐다고 믿습니다. PXC에서 규칙은 "첫 번째 승리를 저지름"입니다. node1 (예 : autocommit = 0; BEGIN;) 및 UPDATE id = 1에서 수동 트랜잭션을 시작하고 node2에서 커밋하지 않으면 동일한 행에 대한 업데이트를 자동 커밋합니다. 그러면 node2에서 성공하고 node1에서 성공합니다. 수동 UPDATE를 커밋하면 교착 상태 오류가 발생합니다. 이것은 올바른 동작입니다.

자동 연결 여부는 중요하지 않습니다. 어느 쪽이 먼저 이기고 다른 쪽은 재 시도해야합니다. 이것이 PXC에서 여러 노드에 쓰는 것을 권장하지 않는 이유입니다.

예, 여러 노드에 쓰고 싶다면 "try-catch-retry"코드를 조정하여이 오류 케이스를 처리해야합니다.

+0

수동 트랜잭션에 대한 전체 랩핑 재시도 처리가 이미 필요합니다 (제대로 작동하려면 꽤 필요합니다). 자동 커밋 트랜잭션이 실패할지 여부는 내 질문에 달려 있습니다. 생각하고있는 상황은 두 노드가 동시에 같은 레코드에서 트랜잭션을 수행하려고 할 때입니다. 노드 1은 완료되고 노드 2는 별도로 완료되지만 복제 할 때 그 중 하나가 실패해야합니까? 그렇다면 PXC 자동으로 실패한 자동 커밋을 시도합니까? –

+0

예, 자동 커밋 트랜잭션도 실패 할 수 있습니다. 그들은 afterall 거래입니다. 자동 커밋 = 0 또는 = 1이면 아무런 차이가 없습니다. "노드 2가 별도로 완료됩니다"라는 문장이 잘못되었습니다. 귀하의 예제에서 노드 2는 커밋을 완료하지 않을 것입니다. 커미트가 발생하기 전에 인증이 발생하므로 노드 2는 커밋시 오류를 수신합니다. 노드 1은 커밋 프로세스를 수행합니다. 여기에는 쓰기 세트를 모든 노드 (자체 포함)에 복제하고 인증하는 작업이 포함됩니다. 그런 다음 실제 온 - 디스크 커밋이 발생합니다. 커밋시 노드 2 또한 복제하여 로컬에서 인증하려고 시도하지만 실패하면 실패합니다. – utdrmac

+0

나는 결코 실패하지 않을 것이라고 말했다. 나는 그것이 실패 할 것을 안다; 문제는 데이터베이스가 자동 커밋 모드에서 실패 할 경우 자동으로 트랜잭션을 다시 시도 할 것인가? –