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

As instruções mysql únicas são atômicas em MyISAM e InnoDB?


Sim e não :-)

Em ambos os casos, o acesso é serializado (supondo que você esteja usando um mecanismo transacional como o InnoDB), pois eles atingem a mesma linha, para que não interfiram um no outro. Em outras palavras, as declarações são atômico.

No entanto, a contagem de linhas afetadas realmente depende do seu conjunto de configurações quando você abre a conexão. A página para mysql_affected_rows() tem isso a dizer (meu negrito):

E da página mysql_real_connect :

Então, em termos do que acontece com CLIENT_FOUND_ROWS sendo configurado, as linhas afetadas para:
UPDATE T1 SET C1 = 'dirty' WHERE id = 1

não tem nada para ver se os dados são alterados, apenas quais linhas corresponderam. Isso seria 1 para ambas as consultas.

Por outro lado, se CLIENT_FOUND_ROWS foi não definido, a segunda consulta não estaria realmente alterando a linha (já que já está preenchida com 'sujo') e teria uma contagem de linhas igual a zero.

Se você quisesse o mesmo comportamento independentemente dessa configuração (mostrando apenas as alterações), você pode usar algo como:
UPDATE T1 SET C1 = 'dirty' WHERE id = 1 AND C1 <> 'dirty'