GET_LOCK(str,timeout)

GET_LOCK(str,timeout)

timeout 秒の待機時間を使用して、ストリング str によって与えられた名前でロックの獲得を試みます。ロックの獲得が成功した場合は 1 を戻し、試行が時間切れになった場合 ( 例えば、他のクライアントがすでにその名前をロックしている場合 ) は 0 を、または、エラーが発生 ( メモリの不足、または mysqladmin kill によるスレッドの停止 ) した場合は NULL を戻します。GET_LOCK() でロックを獲得した場合、RELEASE_LOCK() を実行した時、新しい GET_LOCK() を実行した時、または接続が切断された時 ( 正常または異常な終了を問わず ) にリリースされます。GET_LOCK() でロックを獲得した場合は、トランザクションと対話しないようにしてください。これは、トランザクションをコミットしても、トランザクション中に獲得されたそれらのロックはリリースされないためです。

この関数は、アプリケーション ロックの実装、またはレコード ロックのシミュレートに使用することができます。名前はサーバ全体に渡ってロックされます。ひとつのクライアントが名前をロックすると、GET_LOCK() が他のクライアントからの同じ名前の使用要求をブロックします。これによって、与えられたロック名を承認したクライアントが、名前を使用して協調任意型のロックを行うことができます。ただし同時に、協調するクライアントのセットにないクライアントも、過失にせよ故意にせよ、名前をロックすることができることになり、協調するクライアントがその名前を使用できなくなりますので注意してください。それを防ぐひとつの方法は、データベース固有、またはアプリケーション固有のロック名を使用することです。フォーム db_name.str または app_name.str のロック名を使用するのもその一例です。

mysql> SELECT GET_LOCK('lock1',10);
        -> 1
mysql> SELECT IS_FREE_LOCK('lock2');
        -> 1
mysql> SELECT GET_LOCK('lock2',10);
        -> 1
mysql> SELECT RELEASE_LOCK('lock2');
        -> 1
mysql> SELECT RELEASE_LOCK('lock1');
        -> NULL

2 番目の RELEASE_LOCK() 呼び出しは、ロック 'lock1' が 2 番目の GET_LOCK() 呼び出しによって自動的にリリースされるため、NULL を戻します。

注記 :ライアントが、他のクライアントによってすでに確保されたロックの獲得を試みると、timeout 引数によってそのクライアントはブロックされます。ブロックされたクライアントが停止する場合、そのスレッドはロックがタイムアウトを要求するまで停止しません。これは既知のバグです。