0

MySQLデータベースに、モバイルデバイスの同期パラメーターを決定する関数があります。この関数は、ユーザーがデータベースと同期した最後の日時を判別します。同期操作中に、このサーバー側関数を2回呼び出します。2回目に呼び出すとすぐに、Sync_Recordsテーブル全体がロックされます。他の接続からどこにも書き込むことができません(最初の呼び出しの後、テーブルはロックされていないことに注意してください)。関数をProcedureに変更しましたが、すべて問題ありません。2回目の呼び出し後にロックは発生しません。同期操作全体(関数/プロシージャへの両方の呼び出しを含む)はトランザクション内にあります。これはInnoDbテーブルです。

関数/プロシージャは、単に2つのselectステートメントを実行します。結果をローカル変数に格納してから、日時変数を返します。テーブルがロックされている理由がわかりません。誰かアイデアはありますか?

4

1 に答える 1

3

収録番組制限欄に明記

ストアド ファンクションは、実行前にテーブル ロックを取得します。これにより、ステートメントが実行される順序とログに表示されるタイミングの不一致によるバイナリ ログの不整合が回避されます。ステートメント ベースのバイナリ ログを使用すると、関数内で実行されたステートメントではなく、関数を呼び出すステートメントが記録されます。...

対照的に、ストアド プロシージャはテーブル レベルのロックを取得しません。ストアド プロシージャ内で実行されるすべてのステートメントは、ステートメント ベースのバイナリ ログの場合でも、バイナリ ログに書き込まれます。

于 2013-02-07T15:42:21.480 に答える