Soll ich eine ISAM Tabelle sperre Wert zu einem einzigartigen Schlüsselfeld einfügen?

StackOverflow https://stackoverflow.com/questions/169459

  •  05-07-2019
  •  | 
  •  

Frage

Ich habe eine ISAM-Tabelle in Mysql, die ähnlich wie diese erstellt wurde:

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

create unique index nameIndex on mytable (name);

Ich habe mehrere Prozesse Zeilen in dieser Tabelle einfügen. Wenn zwei Prozesse versuchen, den gleichen „name“ einzufügen, möchte ich sicherstellen, dass einer von ihnen entweder einen Fehler bekommt oder findet die Zeile mit dem passenden „Namen“.

Soll ich die Tabelle sperren und im Schloss stellen Sie sicher, dass der Name nicht existiert, oder sollte ich verlassen sich auf dem Server einen Fehler an einer der Prozesse geben, die versuchen, einen Wert einzufügen, die in der einzigartigen existiert bereits indiziert Feld?

Ich bin ein wenig zögerlich, eine Sperre zu verwenden, weil ich möchte nicht in einer Deadlock-Situation erhalten.

War es hilfreich?

Lösung

Kümmern Sie sich nicht sperren, Ihr Index wird Duplikate verhindern. Sie sollten den Fehlercode aus Ihrer Anwendung behandeln.

MySQL sollte einen Fehlercode von 1062 zurückzukehren (oder SQLSTATE 23000), wenn Sie Ihre einzigartige Schlüsselbedingung verletzt wird.

Andere Tipps

Durch die Art und Weise Sie die Angst beschrieben ein Deadlock zu begegnen, kann die Kausalität nicht eindeutig verstanden werden (es sei denn, es gibt mehr zu Ihrer Abfrage als in der Frage beschrieben).

Eine gute Zusammenfassung jemand anderes rel="nofollow schrieb :

  
      
  1. Abfrage 1 beginnt mit der Ressource A Verriegelung
  2.   
  3. Abfrage 2 beginnt mit der Ressource B Verriegelung
  4.   
  5. Abfrage 1, um fortzufahren, muss eine Sperre auf Ressource B, aber Abfrage 2 wird diese Ressource sperren, so Abfrage 1 beginnt warten auf sie lösen
  6.   
  7. In der Zwischenzeit Abfrage 2 versucht zu beenden, aber es muss eine Sperre auf Ressource A, um zu beenden, aber es kann nicht das, weil Abfrage 1 die Sperre auf, dass hat.
  8.   
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top