2012-02-14 14 views
1

私はメールキューを実装しているMySQLテーブルを持っていますが、システム内の予期しないエラーを報告するメールも送信します。時にはこれらの例外のないエラーがトランザクション内に発生することがあります。トランザクションをロールバックする際に、メールキューテーブルに挿入された行(予期しないエラーを報告しているメール)を取り消します。Mysqlは現在のトランザクションを無視して行を挿入します

私の質問は、可能なトランザクションロールバックを無視して、途中でテーブルに行を挿入するにはどうすればよいですか。つまり、トランザクションが最終的にロールバックされた場合、エラーの詳細を報告する電子メールの行挿入もロールバックしないことになります。

このテーブルは、複数の非同期プロセスによって読み取られ、キュー内のメールを送信することができます。このシナリオでは、メールは一度しか送信できないため、MyISAMテーブルタイプを使用することはできません。 Innodb。

ありがとうございます。

+0

RDBMS機能を(誤って)使用しないで、適切な非同期メールキューを実装しないのはなぜですか? –

+0

@ N.B。 RDBMSは完全に有効なメールキューです。そこにあるRDBMSベースのMTAはすべて私に同意します。 –

+0

@EugenRieckどこが妥当でないと言いましたか?このシナリオにはうまく収まりません。トランザクションは使用されていますが、クエリはロールバックに「生き残る」必要があります。これは設計上の失敗を意味し、ロールバックに耐えられるように特定のデータを強制しようとするよりも、異なるアプローチがより良い解決策になる可能性があります。 –

答えて

2

INSERTは、取引のROLLBACKに生き残る必要がある場合は、取引の一部ではないと言っても過言ではありません。ですから、単にトランザクションの外に移動するだけです。それを達成するための多くの方法があります。

  • 取引でいる間、代わりにあなたにINSERTを実行するので、セッション変数で フィールドを保存する(これらはROLLBACKを生き残る)、 後にトランザクションがセッションからの挿入を実行します変数
  • スキルを再考する - より深刻な問題が発生する
  • 2つ目のDB接続を開き、INSERTを実行すると、最初の接続でトランザクションの影響を受けません。
+0

ありがとうございます。新しい接続を開くと正常に動作しています。 – user1023768

0

エラーを挿入するためにデータベースと異なる接続を作成し、同じトランザクションコンテキストには挿入されないようにすることができます。

関連する問題