- PR -

MySQLのロックについて

1
投稿者投稿内容
taro
ベテラン
会議室デビュー日: 2003/08/06
投稿数: 55
投稿日時: 2007-05-17 19:15
MySQLとC# .NET2005 で開発をしているのですが
MySQLのロック処理が安定しなくて苦労してます。
ロック対象のテーブルはInnoDBなので行ロックをしようとおもって
Select 〜 FOR UPDATEを記述しています。
しかし、なぜかわかりませんが行ロックでなくほかの行をもロックするときもあります。

どなたか、ご存知なことがありましたらご教授お願いします。

[ メッセージ編集済み 編集者: taro 編集日時 2007-05-17 19:15 ]
ひややっこ
会議室デビュー日: 2007/03/30
投稿数: 1
お住まい・勤務地: 埼玉県
投稿日時: 2007-05-17 20:52
InnoDB のロックレベルは、隔離レベルの設定、主キー/一意制約/インデックスの有無により、テーブルロックと行ロックが切り替えられます。
ちょっと見にくいのですが、下表を参照してください。

1. 隔離レベルが READ UNCOMMITTED/READ COMMITTED の場合
  1-1. 主キー/一意制約/インデックスあり … 行ロック
  1-2. その他 … テーブルロック

2. 隔離レベルが REPEATABLE READ/SERIALIZABLE の場合
  2-1. 主キー/一意制約あり … 行ロック
  2-2. 主キー/一意制約なし&インデックスあり … テーブルロック
  2-3. その他 … テーブルロック

[ 注意点 ]
InnoDB の分離レベルは主要 DB と異なり、デフォルトが REPEATABLE READ になっています。
taro
ベテラン
会議室デビュー日: 2003/08/06
投稿数: 55
投稿日時: 2007-05-17 21:17
早速のご教授ありがとうございます。

教えていただいた設定を見直したのですが
行ロックをかけたいテーブルは主キーに一意制約をしておりますので
隔離レベルにかかわらず行ロックがかかるとおもっております。

また、同テーブルに行ロックをかけて成功する場合と失敗しタイムアウトエラーが発生する現象がおこったりもしております。
1

スキルアップ/キャリアアップ(JOB@IT)