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