Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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...
>
http://dev.mysql.com/doc/refman/5.1/en/lock-tables-and-transactions.html
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.
http://dev.mysql.com/doc/refman/5.1/en/lock-tables-and-transactions.html