2017-02-17 5 views
0

を実行している場合UpdateTable()は、テーブルのデータを変更するストアドプロシージャである場合には、次のように私は、通常のMySQLのイベントを設定するトリガーしないようにMySQLのイベントを設定する方法。最後のイベントはまだ

CREATE EVENT UpdateTable_Every1Mins -- Create and Event 
ON SCHEDULE EVERY 1 MINUTE STARTS CURRENT_TIMESTAMP + INTERVAL 1 MINUTE 
DO CALL UpdateTable(); 

場合によっては、UpdateTableプロシージャに時間がかかり、最大3分までかかることがあります。上記のクエリに示されているように、間隔を1分に設定しているので、現在のUpdateTable呼び出しがまだ実行されているときに、新しいUpdateTable呼び出しがトリガーされないようにするにはどうすればよいですか?

ありがとうございます。

答えて

2

直接にはできません。

間接的に、確かに。手続きの終了前に

IF GET_LOCK('my_lock_name',0) IS NOT TRUE THEN 
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'failed to obtain lock; not continuing'; 
END IF; 

右:他の作業の前に手順インサイド

DO RELEASE_LOCK('my_lock_name'); 

これは名前のロックです。行や表をロックしません。同じ名前を他のスレッドでロックすることができないように、グローバルメモリ構造で名前'my_lock_name'(あなたが作った名前)をロックするだけです。そして手動でヌルまたは0を参照してくださいGET_LOCK()いずれかIS NOT TRUEマッチ - 0はロックの周りに待機することなく、他の誰かが、エラーが発生した場合、ロックはnullを保持している場合は、直ちに(0)falseを返すことではないことを意味します。上記のコードは、MySQL Server 5.5以降で動作します。以前のバージョンではロックがサポートされていましたが、実行を中止するにはSIGNALをサポートしていません。

クライアントスレッドが終了したときにリリースされ、各イベント呼び出しが独自のスレッドにあり、イベント呼び出しが終了したときに終了するため、ロックを解放することは技術的には必要ありませんが、ベストプラクティスです。

SIGNALは、手順の、イベントのこの呼び出しの実行を停止する例外をスローします。 message_textは、MySQLエラーログに記録されます。

+0

ワンダフル!答えをありがとう! – user1034912

関連する問題