sql >> データベース >  >> RDS >> Mysql

mysql-選択クエリの行をロックしますか?

    ネイティブ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の両方が同じように機能します。



    1. MySQLテーブルを2列で並べ替える

    2. DenoとOakでMySQLを使用する方法

    3. SQL Server(T-SQL)でAM/PMを時間値に追加する方法

    4. MySQL utf8mb4、絵文字を保存するときのエラー