it-swarm.it

Gli INSERT si impegnano automaticamente?

La nostra applicazione genera una query INSERT nel database MySQL per aggiungere record. Voglio sapere se i record vengono impegnati automaticamente. Se eseguo il comando ROLLBACK, quando viene eseguito il rollback del database? È possibile un ROLLBACK dopo un COMMIT?

13
RPK

La risposta alla tua domanda dipende dal fatto che tu sia o meno all'interno di una transazione che si estenderà su più di una dichiarazione. (Hai taggato la domanda con InnoDB, la risposta sarebbe diversa con MyISAM.)

Dal manuale di riferimento: http://dev.mysql.com/doc/refman/5.1/en/commit.html

Per impostazione predefinita, MySQL funziona con la modalità autocommit abilitata. Ciò significa che non appena si esegue un'istruzione che aggiorna (modifica) una tabella, MySQL memorizza l'aggiornamento su disco per renderlo permanente.

Quindi sì, per impostazione predefinita, se stai solo usando INSERT, i record che inserisci saranno impegnati e non ha senso provare a ripristinarli. (Questo è effettivamente lo stesso che racchiude ogni istruzione tra BEGIN e COMMIT.)

Tuttavia, se hai a che fare con transazioni esplicite, dovrai utilizzare COMMIT per eseguire il commit dell'archiviazione dei record, ma sarai anche in grado di utilizzare ROLLBACK.

Puoi avviare esplicitamente una transazione usando START TRANSACTION (o BEGIN). Questo è indipendente dall'impostazione autocommit (attivata per impostazione predefinita):

Con START TRANSACTION, autocommit rimane disabilitato fino al termine della transazione con COMMIT o ROLLBACK. La modalità autocommit quindi ritorna allo stato precedente.

In alternativa, se autocommit=0, Penso che qualsiasi dichiarazione che segue un'altra fine della transazione, avvierà una transazione (ma puoi comunque usare START TRANSACTION esplicitamente); questo è almeno il modo in cui interpretalo :

La modalità autocommit. Se impostato su 1, tutte le modifiche a una tabella hanno effetto immediato. Se impostato su 0, è necessario utilizzare COMMIT per accettare una transazione o ROLLBACK per annullarla. Se autocommit è 0 e lo si cambia in 1, MySQL esegue un COMMIT automatico per qualsiasi transazione aperta. Un altro modo per iniziare una transazione è usare un'istruzione START TRANSACTION o BEGIN. Vedere la Sezione 12.3.1, "INIZIA TRANSAZIONE, COMMIT e sintassi ROLLBACK".

Più specificamente "un altro modo per iniziare una transazione" sembra implicare che l'impostazione "autocommit = 0" è sufficiente per avviare una transazione (almeno appena prima di ogni istruzione all'inizio di una sessione o che segue un COMMIT/ROLLBACK). Suggerirei di usare BEGIN o START TRANSACTION esplicitamente comunque anche se autocommit=0, in quanto può rendere più chiaro vedere l'inizio o la fine della transazione.

(Il modo in cui si avvia una transazione può dipendere dal modo in cui l'applicazione utilizza MySQL.)

10
Bruno

Per impostazione predefinita, InnoDB è impostato su autocommit = 1 o ON . Una volta impegnati, non possono essere ripristinati.

Dovresti fare una delle due cose per disabilitarlo in futuro:

OPZIONE 1: aggiungi questo a /etc/my.cnf e riavvia mysql

[mysqld]
autocommit=0

OPZIONE 2: eseguire uno di questi nella Conenction DB aperta prima di iniziare qualsiasi SQL significativo

SET autocommit = 0;
START TRANSACTION;

Con queste due opzioni, dovresti eseguire un COMMIT manuale o un ROLLBACK manuale .

AVVERTIMENTO

Se la tabella è MyISAM, la spiegazione è più semplice. Poiché non vi sono transazioni per il motore di archiviazione MyISAM, tutti gli INSERT, gli UPDATE e i DELETE eseguiti sono permanenti. Nessun rollback di sorta.

7
RolandoMySQLDBA