1

mysql ロックに関する質問があります。この sql: をクエリすると、select * from user order by id asc limit 0,1000. 次に、許可されている場合、別のスレッドがユーザーテーブルの0,1000の間の行を同時に削除しますか?

4

1 に答える 1

0

InnoDBのMySQL ドキュメントには、次のように記載されていますInnoDB does locking on the row level and runs queries as nonlocking consistent reads by default

ただし、より直接的には、内部ロック方法であり、MySQL uses table-level locking for MyISAM, MEMORY, and MERGE tables, allowing only one session to update those tables at a time. また、これ:

MySQL grants table write locks as follows:
    1. If there are no locks on the table, put a write lock on it.
    2. Otherwise, put the lock request in the write lock queue.
MySQL grants table read locks as follows:
    1. If there are no write locks on the table, put a read lock on it.
    2. Otherwise, put the lock request in the read lock queue.

さて、それを要約しましょう: InnoDB では、各行には独自のロックがあります。つまり、クエリは、ロックされている行にヒットするまでテーブルをループします。ただし、MyISAMでは、テーブル全体に対して 1 つのロックしかなく、クエリが実行される前に設定されます。

つまり、InnoDB の場合、SELECT 操作で行を読み取る前にDELETE 操作で行を削除すると、その行は結果に表示されません。ただし、SELECT 操作が最初に行を読み取った場合、その行は結果セットに返されますが、その後の SELECT 操作では行が表示されません。結果セット全体を InnoDB で意図的にロックしたい場合は、SELECT ... FOR UPDATEを調べてください。

MyISAM では、テーブルはデフォルトでロックされているため、どのクエリが最初に実行を開始したかによって異なります。DELETE 操作が最初に開始された場合、行は SELECT で返されません。ただし、SELECT 操作が最初に実行を開始した場合は、実際に行が返されます。

ここにインターレースの詳細があります: http://dev.mysql.com/doc/refman/5.0/en/select.html

また、ここ: MySQL でロックを発生させずに選択する方法はありますか?

于 2012-09-04T05:04:28.563 に答える