いくつかの 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) 変更についてのみ説明し、(たとえば) SELECT
s の行ロックまたは分離レベルについては説明していません。(b) さらに重要なことに、ユーザー定義関数 (それはデータを変更する DML ステートメントを含む) は、いくつかの包含ステートメント内から呼び出されます。
MySQLの専門家である誰かが明確にしてもらえますか? ありがとう。