一意のキーフィールドに値を挿入するには、ISAMテーブルをロックする必要がありますか?
質問
次のように作成されたISAmテーブルがmySqlにあります:
create table mytable (
id int not null auto_increment primary key,
name varchar(64) not null );
create unique index nameIndex on mytable (name);
このテーブルに行を挿入する複数のプロセスがあります。 2つのプロセスが同じ" name"を挿入しようとした場合、そのうちの1つでエラーが発生するか、一致する" name"のある行を見つけるようにします。
テーブルをロックし、ロックで名前が存在しないことを確認する必要がありますか、または一意のインデックスに既に存在する値を挿入しようとするプロセスのいずれかにエラーを与えるサーバーに依存する必要がありますフィールド?
デッドロック状態になりたくないので、ロックを使用することに少し抵抗があります。
解決
ロックを気にしないでください。インデックスは重複を防ぎます。アプリケーションからのエラーコードを処理する必要があります。
一意キー制約に違反すると、MySQLはエラーコード1062(またはSQLSTATE 23000)を返します。
他のヒント
DEADLOCKに遭遇する恐れを説明したところでは、原因が明確に理解されていない可能性があります(質問で説明されている以外にクエリの詳細がない限り)。
優れた他の誰かが書いた要約:
- クエリ1はリソースAをロックすることから始まります
- クエリ2は、リソースBをロックすることから始まります
- クエリ1は続行するにはリソースBをロックする必要がありますが、クエリ2はそのリソースをロックしているため、クエリ1は解放を待機し始めます
- その間、クエリ2は終了を試みますが、終了するにはリソースAをロックする必要がありますが、クエリ1がロックしているため取得できません。
所属していません StackOverflow