Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

O lastInsertId do PDO para MySQL é uma condição de corrida?


O MySQL não retorna o último ID de inserção de uma sessão para outra sessão.

http://dev.mysql .com/doc/refman/5.6/en/information-functions.html#function_last-insert-id diz:

Re seus comentários:

Este tem sido o comportamento do MySQL desde o início. Retornar o último ID de inserção seria bastante inútil se fosse suscetível a uma condição de corrida, ou seja, se inserções em outras sessões pudessem poluir sua sessão.

Uma possibilidade é que você esteja usando conexões persistentes, porque as versões antigas do PHP tinham um bug de que uma conexão poderia ser fornecida a uma nova solicitação PHP e conceder acesso ao estado com escopo de sessão de uma solicitação PHP anterior. Em outras palavras, coisas como bloqueios e transações e tabelas temporárias e variáveis ​​de usuário e o último ID de inserção podem sobreviver a uma solicitação PHP subsequente. Esses problemas devem ser resolvidos no PHP 5.3 com o driver mysqlnd; uma conexão persistente deve ser "redefinida" para um estado inicial.

Outra explicação possível é que está realmente funcionando corretamente, e você está enganado em suas observações. Então eu sugiro testá-lo com cuidado e metodicamente.

atualizar: de acordo com sua resposta , esse problema não tinha nada a ver com MySQL ou PDO ou lastInsertId. Parece que você não estava vendo discrepâncias na saída do seu código PHP, você estava vendo números inesperados nas estatísticas de desempenho da rede no Chrome Dev Tools.