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);

我有多个进程在此表中插入行。如果两个进程尝试插入相同的“名称”,我想确保其中一个出现错误或找到具有匹配“名称”的行。

我应该锁定表并确保名称不存在,还是应该依靠服务器向尝试插入唯一索引字段中已经存在的值的进程之一提供错误?

我对使用锁有点犹豫,因为我不想陷入僵局。

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 回答