我应该锁定ISAM表以将值插入唯一键字段吗?

时间:2008-10-04 00:58:07

标签: mysql unique isam

我在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 个答案:

答案 0 :(得分:4)

不要打扰锁定,您的索引会阻止重复。您应该从应用程序处理错误代码。

当违反您的唯一键约束时,MySQL应该返回错误代码1062(或SQLSTATE 23000)。

答案 1 :(得分:0)

顺便说一下,你描述了遇到DEADLOCK的恐惧,可能无法清楚地理解因果关系(除非你的查询比问题中描述的更多)。

summary someone else wrote

  
      
  1. 查询1首先锁定资源A
  2.   
  3. 查询2以锁定资源B
  4. 开始   
  5. 查询1,为了继续,需要锁定资源B,但是查询2正在锁定该资源,因此查询1开始等待它释放
  6.   
  7. 与此同时,查询2尝试完成,但它需要锁定资源A才能完成,但它无法获取,因为查询1已锁定。
  8.