Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Djonatan Buss

Utilizar último ID inserido

Recommended Posts

O Caso: ao inserir um carro na base de dados, na tabela A, quero usar o ID gerado pelo auto incremento e inserir na tabela B que armazena o ultimo gasto que o carro deu.

 

Sei que vão sugerir usar um select q mostre o ultimo inserido, o mysql_insert_id() e o LAST_ID() (?)

Minha preocupação é que nesse pequeno espaço de tempo que ocorre uma inserção na tabela A e é pego o id para fazer a inserção na tabela B ocorra uma outra inserção na tabela A usando a mesma conexao. Quebrando a integridade e bagunçando tudo.

 

Eu ultimamente venho fazendo um select pelos exatos dados que inseri, então busco o id e insiro na outra.

Me parece pouco profissional e queria ver com os experientes outras possibilidades...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como disse o Douglas, a resposta disso está em inglês na documentação do MySQL, deve-se usar LOCK/UNLOCK TABLES, vou tentar dar uma traduzida.

 

A forma correta de usar LOCK TABLES e UNLOCK TABLES em tabelas transacionais como as InnoDB, é começar com SET autocommit = 0 (invés de START TRANSACTION) seguida por LOCK TABLES e só chamar UNLOCK TABLES após comitar a transação explicitamente. Por exemplo, se voce precisa escrever na tabela T1 e ler na tabela T2, pode fazer assim

 

SET autocommit=0;

LOCK TABLES t1 WRITE, t2 READ, ...;

... do something with tables t1 and t2 here ...

COMMIT;

UNLOCK TABLES;

(WRITE = escrever, READ = ler)

Quando voce chama LOCK TABLES, internamente o InnoDB deixa sua própria tabela fechada, e o MySQL deixa sua própria tabela fechada. InnoDB libera a sua tabela inter no próximo commit, mas pro MySQL liberar você tem que chamar UNLOCK TABLES. Você não deve setar autocommit = 1, por que assim InnoDB libera a sua tabela interna fechada imediatamente após a chamada de LOCK TABLES, e deadlocks podem acontecer facilmente. InnoDB nao irá fechar (/travar/reservar) a tabela de forma alguma se autocommit = 1.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.