2012-02-14 3 views
1

메일 대기열을 구현하는 MySQL 테이블이 있으며 시스템의 예상치 못한 오류를보고하는 메일을 보내기 위해 사용합니다. 때로는 이러한 unexcepted 오류 ocurrs 그래서 내가 트랜잭션을 롤백 또한 삽입 된 행 (예기치 않은 오류를보고하는 메일) 메일 대기열 테이블에서 실행 취소됩니다.Mysql은 현재 트랜잭션을 무시한 행을 삽입합니다.

제 질문은 가능한 트랜잭션 롤백을 무시하고 트랜잭션 중간에 테이블에 행을 삽입하려면 어떻게합니까? 트랜잭션이 마침내 롤백되는 경우 오류 정보를보고하는 전자 메일에 대한 행 삽입도 롤백하지 않습니다.

이 테이블은 대기열에서 메일을 보내기 위해 여러 개의 비동기 프로세스에서 읽을 수 있으므로이 시나리오에서는 MyISAM 테이블 유형을 사용할 수 없도록 전자 메일을 보낼 수 있도록 행을 차단해야하며 Innodb.

미리 감사드립니다.

+0

RDBMS 기능을 (잘못) 사용하지 않고 적절한 비동기 메일 대기열을 구현하지 않는 이유는 무엇입니까? –

+0

@ N.B. 나는 달랐다 : RDBMS는 완벽하게 유효한 메일 대기열이다. 거기에있는 모든 RDBMS 기반 MTA가 저와 동의합니다. –

+0

@EugenRieck 그것이 유효하지 않다고 나는 어디에서 말 했습니까? 여기서는 시나리오에 잘 맞지 않지만 트랜잭션은 사용 중이지만 쿼리는 롤백을 "생존"해야합니다. 이는 설계 실패를 의미하며 특정 데이터가 롤백에서 생존하도록 시도하는 것보다 다른 방법이 더 나은 솔루션 일 수 있습니다. –

답변

2

INSERT은 거래의 ROLLBACK에서 생존해야한다고 말하는 것이 안전합니다. 거래의 일부가 아닙니다. 그래서 당신이해야 할 일은 단순히 거래 외부로 이동시키는 것입니다. 그것을 달성하는 방법에는 여러 가지가 있습니다 :

  • 거래에 대신 당신에게 INSERT을 실행하는 트랜잭션이 세션에서 삽입을 실행 후 세션 변수의 필드 (이이 ROLLBACK 살아남을 것이다), 저장하는 동안 변수
  • 스키마를 다시 생각해보십시오. 좀 더 깊이있는 문제가 있습니다.
  • 두 번째 DB 연결을 열고이 노드에서 INSERT을 실행하면 첫 번째 연결에서 트랜잭션의 영향을받지 않습니다.
+0

감사합니다. 새 연결을 열면 정상적으로 작동합니다. – user1023768

0

데이터베이스에 다른 연결을 작성하여 오류를 삽입하면 동일한 트랜잭션 컨텍스트에 있지 않아 삽입 될 수 있습니다.

관련 문제