2

Mysql バージョン 5.5 で典型的な「監査ログ」トリガーを実装しました。AFTER INSERTを使用して、テーブルuserから挿入された行を「audit_log」テーブルにコピーします。

したがって、このシーケンスの場合:

BEGIN;
insert into user (name) values ('joe');
<--trigger fires, adds new row to audit_log table-->
COMMIT;

次に、「audit_log」に「joe」を含む新しい行を取得します。偉大な。

ただし、トリガーを起動した挿入がそれを囲むトランザクションによって中止された場合でも、トリガーの結果が適用されるようです。

したがって、このシーケンスの場合:

BEGIN;
insert into user (name) values ('mary');
<--trigger fires, adds new row to audit_log table-->
ROLLBACK;

私はまだ、ユーザー テーブルにコミットされていないデータを参照する新しい行 'mary' を audit_log に残しています。これは明らかに間違っているようです。

Postgres で実行されたトリガーの更新は、元のトランザクション内で実行されるように見えます。これは、私が予想していたことです。MySQLでこれを経験した人はいますか? 私の設定が間違っているのではないでしょうか?

この質問は、すべての更新が元のトランザクションで発生することを意味していることに注意してください。ただし、答えはトリガーに関するMysqlのマニュアルページを参照しており、実際には「トランザクション」についてはまったく言及されていません。

4

1 に答える 1

3

私の監査テーブルは MyISAM エンジンを使用していたことが判明しました。これはもちろん、トランザクションに正しく従うことを妨げていました。

私の同僚は、ラリー・エリソンに謝罪する義務があると言っています。

ラリー、申し訳ありませんが、Mysql のトランザクション セマンティクスを疑っていました。

于 2013-03-28T23:01:08.467 に答える