ネイティブMySQLロックはこの機能を提供しません。列を使用して「ロック」を実行できます。
各スレッドに一意のIDがあるとすると、thread_owner
という名前の列を作成できます。 、デフォルトは0です。
1つのスレッドは次のような行を取得します:
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1
次に、次のように行を選択します(処理する行がない場合は、何も返されない可能性があります):
SELECT *
FROM mytable
WHERE thread_owner = :my_threadID
次に処理し、最後に削除します。
このソリューションは、MyISAMとInnoDBの両方で機能します。
ただし、InnoDBの場合、各UPDATEステートメントがthread_owner =0のすべての行をロックしようとするため、処理が遅くなる可能性があります。また、毎回同じ順序ですべての行をロックしていることが確実でない限り、デッドロックが発生する可能性もあります。したがって、UPDATEステートメントでテーブル全体を明示的にロックしてみてください。
LOCK TABLES mytable WRITE;
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1;
UNLOCK TABLES;
そうすれば、MyISAMとInnoDBの両方が同じように機能します。