it-swarm-eu.dev

Dostanou VLOŽKY automatický závazek?

Naše aplikace vyvolá dotaz INSERT do databáze MySQL a přidá záznamy. Chci vědět, zda se záznamy dostanou automaticky. Pokud spustím příkaz ROLLBACK, kdy databáze provede vrácení zpět? Je ROLLBACK možný po COMMIT?

13
RPK

Odpověď na vaši otázku závisí na tom, zda se nacházíte v transakci, která zahrnuje více než jedno prohlášení. (Označili jste otázku pomocí InnoDB, odpověď by byla u MyISAM odlišná.)

Z referenční příručky: http://dev.mysql.com/doc/refman/5.1/en/commit.html

Ve výchozím nastavení MySQL běží s povoleným režimem autocommit. To znamená, že jakmile spustíte příkaz, který aktualizuje (upraví) tabulku, MySQL uloží aktualizaci na disk, aby byla trvalá.

Takže ano, ve výchozím nastavení, pokud právě používáte INSERT, budou záznamy, které vložíte, potvrzeny a nemá smysl se je pokoušet vrátit zpět. (Toto je ve skutečnosti stejné jako obtékání každého příkazu mezi BEGIN a COMMIT.)

Pokud však s transakcemi jednáte explicitně, budete muset k uložení záznamů použít COMMIT, ale budete také moci použít ROLLBACK.

Transakci můžete zahájit explicitně pomocí START TRANSACTION (nebo BEGIN). To je nezávislé na nastavení autocommit (ve výchozím nastavení zapnuto):

U STARTOVÝCH TRANSAKCÍ zůstane autocommit zakázáno, dokud transakci neukončíte COMMIT nebo ROLLBACK. Režim autocommit se poté vrátí do předchozího stavu.

Případně, pokud autocommit=0, Myslím, že jakýkoli příkaz po dalším konci transakce zahájí transakci (ale stále můžete použít START TRANSACTION explicitně); to je alespoň způsob, jakým jsem interpretovat :

Režim autocommit. Pokud je nastavena na 1, všechny změny tabulky se projeví okamžitě. Pokud je nastavena na 0, musíte použít COMMIT pro přijetí transakce nebo ROLLBACK pro zrušení transakce. Pokud je autocommit 0 a změníte jej na 1, MySQL provede automatický COMMIT každé otevřené transakce. Dalším způsobem, jak zahájit transakci, je použití příkazu START TRANSAKCE nebo BEGIN. Viz oddíl 12.3.1 - „ZAČÁTEK TRANSAKCÍ, POTVRDIT a ROLLBACK Syntax“.

Konkrétněji „jiný způsob, jak zahájit transakci“, zdá se, naznačuje, že nastavení „autocommit = 0“ je dostačující pro zahájení transakce (alespoň těsně před každým příkazem při zahájení relace nebo po COMMIT/ROLLBACK). Navrhuji použít BEGIN nebo START TRANSACTION explicitně přesto, i když autocommit=0, protože může být jasnější vidět, kdy transakce začíná nebo končí.

(Způsob zahájení transakce může záviset na způsobu, jakým aplikace používá MySQL.)

10
Bruno

Ve výchozím nastavení je InnoDB nastaveno na autocommit = 1 nebo ON . Jakmile se zavazují, nemohou být vráceny zpět.

Budete muset udělat jednu ze dvou věcí, abyste ji v budoucnu deaktivovali:

MOŽNOST 1: Přidejte toto do /etc/my.cnf a restartujte mysql

[mysqld]
autocommit=0

MOŽNOST 2: Proveďte jeden z nich v otevřené DB Conenction před zahájením jakékoli smysluplné SQL

SET autocommit = 0;
START TRANSACTION;

V rámci těchto dvou možností byste museli provést manuální COMMIT nebo manuální ROLLBACK .

CAVEAT

Pokud je tabulka MyISAM, je vysvětlení jednodušší. Protože neexistují žádné transakce pro úložný stroj MyISAM, všechny provedené INSERT, UPDATE a DELETE jsou trvalé. Žádné vrácení.

7
RolandoMySQLDBA