Deveria trancar uma tabela ISAM para inserir um valor em um campo de chave exclusivo?

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

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu tenho uma tabela ISAM no MySQL que foi criado semelhante a esta:

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

create unique index nameIndex on mytable (name);

Eu tenho vários processos inserir linhas para esta tabela. Se dois processos tentar inserir o mesmo "nome", eu quero ter certeza de que um deles quer recebe um erro ou encontra a linha com o "nome" correspondente.

Eu deveria trancar a mesa e na fechadura make certeza de que o nome não existe, ou devo confiar no servidor dando um erro para um dos processos que tentam inserir um valor que já existe no indexada única campo?

Estou um pouco hesitante em usar um bloqueio porque eu não quero entrar em uma situação de impasse.

Foi útil?

Solução

Não incômodo bloqueio, o seu índice vai impedir duplicatas. Você deve lidar com o código de erro da sua aplicação.

MySQL deve retornar um código de erro de 1062 (ou SQLSTATE 23000) quando a sua restrição de chave única é violada.

Outras dicas

Pela maneira que você descreveu o medo de encontrar um impasse, a causalidade não pode ser claramente entendido (a menos que haja mais a sua consulta do que o descrito na pergunta).

Um bom resumo alguém escreveu :

  1. Consulta 1 começa por bloqueio recurso A
  2. Consulta 2 começa pelo recurso de bloqueio B
  3. Consulta 1, a fim de continuar, precisa de um bloqueio sobre o recurso B, mas Consulta 2 está travando esse recurso, então Consulta 1 começa esperando por ele para liberar
  4. Entretanto, o Query 2 tentativas para terminar, mas ele precisa de um bloqueio sobre o recurso A, a fim de acabamento, mas não pode obter isso porque Consulta 1 tem o bloqueio sobre isso.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top