Devo bloccare una tabella ISAM per inserire un valore in un campo chiave univoco?

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

  •  05-07-2019
  •  | 
  •  

Domanda

Ho una tabella ISAm in mySql che è stata creata in questo modo:

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

create unique index nameIndex on mytable (name);

Ho più processi che inseriscono righe in questa tabella. Se due processi tentano di inserire lo stesso "nome", voglio assicurarmi che uno di essi ottenga un errore o trovi la riga con il corrispondente "nome".

Dovrei bloccare la tabella e nel lock assicurarmi che il nome non esista o dovrei fare affidamento sul server che dà un errore a uno dei processi che tentano di inserire un valore già esistente nell'indicizzato univoco campo?

Sono un po 'titubante nell'usare un blocco perché non voglio entrare in una situazione di deadlock.

È stato utile?

Soluzione

Non preoccuparti di bloccare, il tuo indice eviterà i duplicati. Dovresti gestire il codice di errore dalla tua applicazione.

MySQL dovrebbe restituire un codice di errore di 1062 (o SQLSTATE 23000) quando viene violato il tuo vincolo chiave univoco.

Altri suggerimenti

Dal modo in cui hai descritto la paura di incontrare un DEADLOCK, il nesso causale potrebbe non essere compreso chiaramente (a meno che non ci sia altro nel tuo interrogatorio di quanto descritto nella domanda)

Un buon riepilogo scritto da qualcun altro :

  
      
  1. La query 1 inizia bloccando la risorsa A
  2.   
  3. La query 2 inizia bloccando la risorsa B
  4.   
  5. La query 1, per continuare, necessita di un blocco sulla risorsa B, ma la query 2 blocca quella risorsa, quindi la query 1 inizia ad attendere il rilascio
  6.   
  7. Nel frattempo, Query 2 tenta di terminare, ma per terminare ha bisogno di un blocco sulla risorsa A, ma non può ottenerlo perché Query 1 ha il blocco su di esso.
  8.   
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top