2010-12-02 2 views
0

2 개의 테이블에 데이터 삽입을 처리하는 프로 시저를 작성하려고합니다. 삽입이 둘 중 하나에서 실패하면 전체 프로 시저가 실패해야합니다. 나는이 여러 가지 방법을 시도해 왔지만 제대로 작동하지 않습니다. 의도적으로 두 번째 삽입을 실패했지만 데이터가 첫 번째 테이블에 삽입됩니다.row_count를 사용하는 프로 시저 예제 찾기

rowcount를 기반으로 IF 문을 중첩하려고 시도했지만 데이터가 두 번째 삽입에서 실패하더라도 데이터는 여전히 첫 번째 테이블에 삽입됩니다. 영향을받은 행이 총 2 개 있습니다.

다른 사람이 여러 삽입물을 처리하는 방법을 보여줄 수 있습니까? 그 중 하나가 실패하면 롤백 할 수 있습니까? 간단한 예가 좋을 것입니다.

답변

0

InnoDB 테이블 (또는 다른 호환 엔진)을 사용하는 경우 MySQL의 Transaction 기능을 사용하여 원하는 것을 정확하게 수행 할 수 있습니다.

  • 은 기본적으로 당신은
  • 할 트랜잭션을 시작할 때마다 결과가 당신이 다른 사람 트랜잭션 내의 모든 쿼리를 무효화 할 수있는 ROLLBACK을 호출 CONMIT에게
  • 를 호출 정상이면 결과
  • 확인 쿼리.

예제는 here입니다.

HTH!

+0

SET autocommit = 0; START TRANSACTION ......

이미 거래를 사용하고 있습니다. 문제는 row_count가 첫 번째 삽입에 대해 1을 반환하고 두 번째에 대해 -1이라고 가정한다는 것입니다. 트랜잭션이 시작 되었더라도 두 번째 삽입이 실패 할 때 데이터는 여전히 첫 번째 테이블에 삽입됩니다. 나는 이미 영향을받는 행을 테스트하고 있는데, 그렇지 않으면 롤백하지 않는다. else commit. – jim

+0

그리고 innoDB 테이블에서 트랜잭션을 사용하는 것이 첫 번째 쿼리를 롤백하지 않습니까? – SubniC

+0

SubniC가 없습니다. 이상합니다. 사이트의 다른 부분에서 작업하는 동안 나는 그것을 오늘 밤에 알아 차렸습니다. 저는 Innodb을 사용하고 있으며 전에도이 문제에 뛰어 들어 본 적이 없습니다. 어떤 아이디어 일 수 있니? – jim

0

자동 연결을 해제 해보십시오. 자동으로 사용자가 명시 적으로 시작된 것 트랜잭션을 커밋되지 않은 경우에도 첫 번째 삽입을 커밋 될 수 있습니다

내가 내 게시물에서 언급해야하지만 모두가 나는 것을 알 것이라고 가정했다
관련 문제