![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|
|
この機能はMyISAMにはなかったものなので、自分用のメモを書きました。 行レベル・ロックとは行レベル・ロックは「レコード単位のロック機能」のことです。1レコードだけロックされるわけではなく、対象となる複数レコードがロックされます。 innoDBテーブル・タイプでは、レコード更新時とSELECT文(ロック・オプション付き)で行レベル・ロックが行われます。 読み取り時のロック通常の「SELECT .. FROM ..」というステートメントでは、いっさいロックされません。また、読み取り一貫性機能によって、こういったクエリーを実行した後に、他でロックしても読み取りを続行することは可能です。 読み取り時にロックしたい場合、明示的にロック方法を指定する必要があります。
共有モードでは、まだ残っている更新トランザクションが存在したら、まず、そのトランザクションが終了するまで待機します。そして、すべての更新が完了した後、データを読み出します。ですから、「できうる限り最新のデータ」を取得することになります。 排他モードでは、まだ残っている更新トランザクションが存在したら、まず、そのトランザクションが終了するまで待機します。そして、すべての更新が完了した後、データを読み出します。つまり、排他モードでも「できうる限り最新のデータ」を取得することになります。 なお、データを更新するSQLは排他モードでのロックとなります。 MySQL独自のロック機構MySQLの行レベル・ロックは、独特なルールがあります。たとえば、次のSQLを実行した場合を考えてみます。
この場合、最初のSQLでは「最大インデックス」を求めています。仮にこの値が「100」だとします。 すると、MySQLでは他のクライアントが「インデックス=101」や「インデックス=200」というレコードを追加することが不可能となります。 実際には「インデックス=101」というレコードはMAX関数を利用しているので存在しません。 このようにして、MySQLでは実際にはレコードがなくてもロック動作が行われます。 このロック方法がMySQLのデフォルト動作ですが、これでは不都合な場合、「SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL」文を実行してロック動作を変更することができます。 |
| Copyright©2001-2008 釣ったよ! All Right Reserved. sg@tsuttayo.sytes.net |