4

いくつかの InnoDB (またはその他のトランザクション対応) テーブルと、MyFunction()戻り値を計算する過程でそれらのテーブルから読み取りまたは書き込みを行うユーザー定義関数があるとします。

さらに、自動コミットが有効になっているとします (つまり、MySQL はデフォルトの方法で動作しています)。

(たとえば)ステートメントを発行した場合:

UPDATE some_table SET col_a = MyFunction(col_b) WHERE col_c='apples';

すべてのテーブル アクセス (明示的な更新some_tableと読み取り/書き込みの両方)MyFunction()単一のトランザクションの一部ですか?

また

各 DML ステートメント内の個々のステートメントはMyFunction()、実行時に自動コミットされますか? その後、キャッシュされた変更がsome_table別の別のトランザクションとして適用されますか?

また

...他の何か?

MySQL のドキュメントを読みましたが、何かを見逃しているか、この問題について明確ではありません。自動コミットをオンにすると、「テーブルを更新 (変更) するステートメントを実行するとすぐに、MySQL は更新をディスクに保存して永続的にします」と述べています。しかし、(a) 変更についてのみ説明し、(たとえば) SELECTs の行ロックまたは分離レベルについては説明していません。(b) さらに重要なことに、ユーザー定義関数 (それはデータを変更する DML ステートメントを含む) は、いくつかの包含ステートメント内から呼び出されます。

MySQLの専門家である誰かが明確にしてもらえますか? ありがとう。

4

1 に答える 1

0

MyFunction() の各呼び出しは、個別のクエリとして扱われ、それ自体がコミットされます。

SO some_table の更新をロールバックしても、自動コミットが有効になっている場合、MyFucntion によって行われた変更は保持されます。

そうは言っても、セッションの自動コミットを無効にするだけで、更新後に手動でコミットできます。

編集:この方法で関数を使用すると、非常に遅くなります。行が更新されるたびに、関数が 1 回呼び出されます。更新時に MyFunction の計算を行い、MyFunction が個別の update ステートメントで行うすべての更新を行う方が速い場合があります。

于 2014-09-04T09:55:16.690 に答える