2012-07-06 9 views
5

Da http://www.sqlite.org/lang_conflict.htmlSQLite differenza conflitto tra ABORT e non riescono

interrompere Quando si verifica una violazione di vincolo del caso, l'algoritmo di risoluzione ABORT Interrompe l'istruzione SQL corrente con un errore SQLITE_CONSTRAIT e ritira le eventuali modifiche apportate dalla corrente Istruzione SQL; ma le modifiche causate da istruzioni SQL precedenti all'interno della stessa transazione vengono mantenute e la transazione rimane attiva. Questo è il comportamento predefinito e il comportamento ha proibito lo standard SQL.

FAIL Quando si verifica una violazione del vincolo applicabile, l'algoritmo di risoluzione FAIL interrompe l'istruzione SQL corrente con un errore SQLITE_CONSTRAINT. Ma la risoluzione FAIL non smentisce le precedenti modifiche dell'istruzione SQL che non hanno avuto esito positivo né termina la transazione. Ad esempio, se un'istruzione UPDATE ha riscontrato una violazione del vincolo sulla centesima riga che tenta di aggiornare, le prime 99 modifiche di riga vengono mantenute, ma le modifiche alle righe 100 e successive non si verificano mai.

Entrambi conservano le modifiche apportate prima dell'istruzione che ha causato la violazione del vincolo e non terminano la transazione. Quindi, suppongo che l'unica differenza sia che la risoluzione FAIL non consente ulteriori modifiche, mentre ABORT esegue solo il backup di istruzioni in conflitto. Ho capito bene?

+0

La tua interpretazione non corrisponde ai documenti incollati qui. ABORT: ripristina l'intera istruzione sql ma non influenza altri sql nella stessa txn. FAIL: solo impedisce la specifica riga fallita (e successive nella stessa istruzione SQL) - ma consente di modificare altre righe. FAIL e ABORT consentono entrambe le altre dichiarazioni all'interno dello stesso txn di essere processate. – javadba

risposta

10

La risposta è semplice: FAIL non esegue il rollback delle modifiche apportate dall'istruzione corrente.

considerare questo 2 tabelle:

CREATE TABLE IF NOT EXISTS constFAIL (num UNIQUE ON CONFLICT FAIL); 
CREATE TABLE IF NOT EXISTS constABORT (num UNIQUE ON CONFLICT ABORT); 
INSERT INTO constFAIL VALUES (1),(3),(4),(5),(6),(7),(8),(9),(10); 
INSERT INTO constABORT VALUES (1),(3),(4),(5),(6),(7),(8),(9),(10); 

La dichiarazione

UPDATE constABORT SET num=num+1 WHERE num<10 

fallirà e cambiare nulla. Ma questo Satement

UPDATE constFAIL SET num=num+1 WHERE num<10 

aggiornerà la prima riga, poi sicuro e lasciare la riga 1 aggiornati, quindi i nuovi valori sono 2, 3, 4, 5, 6, 7, 8, 9, 10