1

次のような作成された mySql の ISAm テーブルがあります。

create table mytable (
 id int not null auto_increment primary key,
 name varchar(64) not null );

create unique index nameIndex on mytable (name);

このテーブルに行を挿入するプロセスが複数あります。2 つのプロセスが同じ「名前」を挿入しようとした場合、そのうちの 1 つがエラーを取得するか、一致する「名前」を持つ行を見つけるようにしたいと考えています。

テーブルをロックし、ロックで名前が存在しないことを確認する必要がありますか、または一意のインデックス付きフィールドに既に存在する値を挿入しようとするプロセスの 1 つにエラーを与えるサーバーに依存する必要がありますか?

デッドロック状態になりたくないので、ロックを使用するのを少しためらっています。

4

2 に答える 2

4

ロックする必要はありません。インデックスによって重複が防止されます。アプリケーションからエラー コードを処理する必要があります。

一意のキー制約に違反した場合、MySQL はエラー コード 1062 (または SQLSTATE 23000) を返す必要があります。

于 2008-10-04T01:00:09.143 に答える
0

ちなみに、デッドロックに遭遇する恐れについて説明したように、因果関係は明確に理解されていない可能性があります(質問で説明されている以上のクエリがない限り)。

他の誰かが書いた良い要約:

  1. クエリ1は、リソースAをロックすることから始まります
  2. クエリ2は、リソースBをロックすることから始まります
  3. クエリ1を続行するには、リソースBをロックする必要がありますが、クエリ2はそのリソースをロックしているため、クエリ1はリソースが解放されるのを待ち始めます。
  4. その間、クエリ2は終了しようとしますが、終了するにはリソースAをロックする必要がありますが、クエリ1がロックしているため、それを取得できません。
于 2008-10-04T01:11:59.867 に答える