sql >> Databáze >  >> RDS >> Mysql

Jsou jednotlivé příkazy mysql atomické v MyISAM a InnoDB?

Ano i Ne :-)

V obou případech je přístup serializován (za předpokladu, že používáte transakční engine jako InnoDB), protože zasahují do stejného řádku, takže se nebudou navzájem rušit. Jinými slovy, výroky jsou atomový.

Počet ovlivněných řádků však ve skutečnosti závisí na vaší konfigurační sadě při otevření připojení. stránka pro mysql_affected_rows() má toto co říct (můj odvážný):

A ze stránky mysql_real_connect :

Tedy pokud jde o to, co se stane s CLIENT_FOUND_ROWS při konfiguraci dotčené řádky pro:

UPDATE T1 SET C1 = 'dirty' WHERE id = 1

nemají nic to, zda se data změnila pouze ty řádky, které se shodují. To by bylo 1 pro oba dotazy.

Na druhou stranu, pokud CLIENT_FOUND_ROWS není nastaven, druhý dotaz by ve skutečnosti neměnil řádek (protože je již naplněn 'špinavým') a měl by počet řádků nula.

Pokud jste chtěli totéž chování bez ohledu na toto nastavení (zobrazení pouze změn), můžete použít něco jako:

UPDATE T1 SET C1 = 'dirty' WHERE id = 1 AND C1 <> 'dirty'


  1. Zobrazit záznamy od teď() do příštích 7 dní v mysql

  2. jaký je rozdíl mezi „změnit přejmenování tabulky“ a „přejmenovat tabulku“?

  3. Jak určit invariantní kulturu při použití FORMAT() na serveru SQL Server

  4. Nastavit průnik v MySQL:čistý způsob