문제

MySQL InnoDB 트랜잭션에서 중복 키 오류가 롤백을 일으킬 것으로 예상합니다. 대신 오류가 발생하지 않고 다음 명령으로 계속됩니다. 커밋 명령에 도달하면 트랜잭션이 커밋되고 중복 키를 일으키는 명령이 있습니다.

이것이 예상되는 행동입니까? 그렇다면, 그러한 오류가 발생할 때 커밋 대신 거래가 롤백되도록 어떻게 설정 하는가?

테스트 환경 :

CREATE TABLE `test` (  
  `id` int(11) NOT NULL, 
  PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

BEGIN;
     INSERT INTO test VALUES (5);
     INSERT INTO test VALUES (5);
COMMIT;

예상 결과 : 표 test 비었다

실제 결과 : 표 test 값 5가있는 하나의 레코드를 포함합니다

도움이 되었습니까?

해결책

오류가 발생하면 MySQL (및 기타 SQL 엔진 Afaik)이 트랜잭션을 자동으로 롤백하지 않습니다.

거래를 롤백하는 오류 처리기를 선언해야합니다.

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
BEGIN 
  ROLLBACK; 
  CALL ERROR_ROLLBACK_OCCURRED; 
END;

다른 팁

복제본으로 인해 삽입이 실패하면 데이터베이스가 트랜잭션을 다시 굴립니다. 그 진술의 시작에.

명령문의 시작 부분에서 작성된 내부 저장 포인트를 사용한 다음 해당 저장 포인트로 롤백합니다.

그것은 당신이 원하는 것이 아니었을 수도 있기 때문에 전체 거래를 롤백하지 않습니다.

MySQL 클라이언트의 동작은 명령 줄 매개 변수를 사용하여 구성 할 수 있습니다. 종료 (암시 적으로 롤백) 또는 계속 될 수 있습니다.

자신의 앱을 사용하는 경우, 그것이하는 일은 당신에게 달려 있습니다.


MySQL은 실패를 처리하는 방법에 대한 정책을 부과하지 않습니다. 응용 프로그램에이를 남깁니다. 그래서 당신이 그들에 대해하는 것은 당신 자신의 사업입니다. 당신이 원한다면 무시할 수 있습니다.

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