2009-10-27 15 views
9

Quando in una transazione mysql innodb, mi aspetto che un errore chiave duplicato causi un rollback. Non lo fa, ma semplicemente genera un errore e continua al prossimo comando. Una volta raggiunto il comando COMMIT, la transazione verrà eseguita, senza che la chiave duplicata causi il comando.errore chiave duplicato non annulla/rollback transazione mysql

È questo il comportamento previsto? In tal caso, in che modo procedere con l'impostazione in modo che la transazione venga annullata anziché impegnata quando si verifica un errore di questo tipo? ambiente

prova:

CREATE TABLE `test` ( 
    `id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

BEGIN; 
    INSERT INTO test VALUES (5); 
    INSERT INTO test VALUES (5); 
COMMIT; 

risultato previsto: tavolo test è vuota

risultato effettivo: tavolo test contiene un record con valore 5

+0

Consulta anche: http://dev.mysql.com/doc/refman/5.0/en/innodb-error-handling. html –

risposta

3

MySql (e altri AFAIK motore SQL) non rollback automaticamente una transazione in caso di errore.

si deve dichiarare un gestore di errori che rollback della transazione:

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND 
BEGIN 
    ROLLBACK; 
    CALL ERROR_ROLLBACK_OCCURRED; 
END; 
8

Se un inserto riesce a causa di un duplicato, il il database riporta la transazione indietro all'inizio di tale affermazione.

Usa un punto di salvataggio interno fatto all'inizio dell'istruzione, quindi torna a quel punto di salvataggio.

NON ripristina l'intera transazione, perché potrebbe non essere quello che volevi.

Il comportamento del client mysql è configurabile utilizzando i parametri della riga di comando. Può uscire (che implicitamente arretrerebbe) o continuare.

Se si sta utilizzando la propria app, ciò che fa dipende da voi.


Mysql non impone politica su come gestire gli errori - lascia che fino alla vostra applicazione. Quindi quello che fai su di loro è affar tuo - puoi ignorarli se vuoi.

+2

voglio darvi come 100 punti rep per "Mysql non impone politica su come gestire gli errori - lascia che fino all'applicazione Quindi ciò che si fa su di loro è la propria attività -. è possibile ignorarli se ti piace ". – longneck

+0

quindi c'è un modo per impostare una transazione in modo che torni automaticamente su un errore chiave duplicato? o devo per monitorare il risultato di ogni query e quindi esplicitamente rollback per ottenere questo comportamento? – allixsenos

Problemi correlati