2012-07-06 16 views
5

De http://www.sqlite.org/lang_conflict.htmlSQLite diferencia conflicto entre ABORTAR y rechazo del

Abortar Cuando se produce una violación de restricción caso, el algoritmo de resolución ABORTAR aborta la instrucción SQL actual con un error SQLITE_CONSTRAIT y se retira cualquier cambio realizado por el actual Declaración SQL; pero los cambios causados ​​por declaraciones SQL anteriores dentro de la misma transacción se conservan y la transacción permanece activa. Este es el comportamiento predeterminado y el comportamiento proscrito del estándar SQL.

FAIL Cuando se produce una violación de restricción aplicable, el algoritmo de resolución FAIL aborta la instrucción SQL actual con un error SQLITE_CONSTRAINT. Pero la resolución FAIL no anula los cambios anteriores de la instrucción SQL que falló ni finaliza la transacción. Por ejemplo, si una instrucción UPDATE encontró una violación de restricción en la fila 100 que intenta actualizar, entonces los primeros 99 cambios de fila se conservan, pero los cambios en las filas 100 y posteriores nunca se producen.

Ambos conservan los cambios realizados antes de la sentencia que causaba la violación de la restricción y no finalizaban la transacción. Por lo tanto, supongo que la única diferencia es que la resolución FAIL no permite que se realicen más cambios, mientras que ABORT solo realiza una copia de seguridad de la declaración conflictiva. ¿Me di cuenta?

+0

Su interpretación no coincide con los documentos pegados aquí. ABORTAR: revierte toda la instrucción sql pero no afecta a otros sql en el mismo txn. FAIL: solo evita la fila que falla específica (y las posteriores en la misma instrucción SQL), pero permite cambiar otras filas. FAIL y ABORT permiten que otras declaraciones dentro del mismo txn procedan. – javadba

Respuesta

10

La respuesta es simple: FAIL no revierte los cambios realizados por la instrucción actual.

consideran este 2 tablas:

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 declaración

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

fallará y no cambiar nada. Pero esta satement

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

actualizará la primera fila, a continuación, fallar y dejar la fila 1 actualiza, por lo que los nuevos valores son 2, 3, 4, 5, 6, 7, 8, 9, 10