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

Identificador de banco de dados DBI com AutoCommit definido como 0 não retornando dados adequados com SELECT?


Suponho que você esteja usando tabelas InnoDB e não MyISAM. Conforme descrito no modelo de transação do InnoDB , todos suas consultas (incluindo SELECT) estão ocorrendo dentro de uma transação.

Quando AutoCommit está ativado, uma transação é iniciada para cada consulta e, se for bem-sucedida, é implicitamente confirmada (se falhar, o comportamento pode variar, mas a transação é garantida para terminar). Você pode ver os commits implícitos no log binário do MySQL. Configurando AutoCommit para false, você deverá gerenciar as transações por conta própria.

O nível de isolamento de transação padrão é REPEATABLE READ , o que significa que todos os SELECT as consultas lerão o mesmo instantâneo (aquele estabelecido quando a transação foi iniciada).

Além da solução dada na outra resposta (ROLLBACK antes de começar a ler) aqui estão algumas soluções:

Você pode escolher outro nível de isolamento de transação, como LEIA COMPROMETIDO , o que torna seu SELECT consultas leem um instantâneo novo toda vez.

Você também pode deixar AutoCommit para true (a configuração padrão) e inicie suas próprias transações emitindo BEGIN WORK . Isso desativará temporariamente o AutoCommit comportamento até que você emita um COMMIT ou ROLLBACK após a qual cada consulta obtém sua própria transação novamente (ou você inicia outra com BEGIN WORK ).

Eu, pessoalmente, escolheria o último método, pois parece mais elegante.