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

Je vložení/aktualizace spojení na MySQL atomická operace?

Rozumím vaší otázce typu „je každý z těchto dotazů sám o sobě atomovou operací?“. Pak je odpověď "ano". Další dvě odpovědi jsou správné, když říkají, že všechna vaše tvrzení dohromady nejsou atomická.

Atomicita v databázích pouze znamená všechno nebo nic. To neznamená správnost údajů. Vaše prohlášení uspěje nebo ne. Nemá to nic společného s připojeními nebo poddotazy. Jeden příkaz je jeden příkaz, bez ohledu na to, zda vaše databáze musí používat dočasnou tabulku v paměti nebo na disku či nikoli.

Transakce pouze sdělují vaší databázi, aby považovala více příkazů za jeden příkaz. Když jeden z příkazů selže, všechny jsou vráceny zpět.

Důležitým souvisejícím tématem je zde úroveň izolace . Možná si o nich budete chtít něco přečíst.

UPRAVIT (pro odpověď na komentář):

To je správně. Dokud se jedná o platné prohlášení a nedojde k výpadku napájení nebo jiným důvodům, proč by dotaz mohl selhat, je hotovo. Atomicita sama o sobě jen zaručuje, že se prohlášení (příkazy) provádí nebo ne. Zaručuje úplnost a nepoškozenost dat (protože operace zápisu nebyla dokončena nebo tak něco). Nezaručuje vám správnost údajů. Zadaný dotaz jako INSERT INTO foo SELECT MAX(id) + 1 FROM bar; musíte se ujistit prostřednictvím nastavení správné úrovně izolace , že nedostanete fantomové čtení nebo tak něco.



  1. Nejlepší způsob, jak ověřit uživatelský vstup JDBC?

  2. Migrace vašeho projektu Django na Heroku

  3. Předání názvu tabulky jako parametru připraveného příkazu

  4. PDO “Nezachycená výjimka 'PDOException' .. Nelze provádět dotazy, dokud jsou aktivní jiné dotazy bez vyrovnávací paměti. Zvažte použití PDOStatement::fetchAll().”