On 6 September 2015 at 18:26, Luuk <luuk34 at gmail.com> wrote: > > Suppose i have 'test.sql': > .echo on > DELETE FROM test; > BEGIN; > INSERT INTO test VALUES(1,'test1'); > INSERT INTO test VALUES(3,'test3',3); > INSERT INTO test VALUES(2,'test2'); > COMMIT; > SELECT * FROM test; > > And a database 'test.sqlite' with the following table: > PRAGMA foreign_keys=OFF; > BEGIN TRANSACTION; > CREATE TABLE test(i int, t text); > COMMIT; > > If i do: > type test.sql | sqlite3.exe test.sqlite > > Than there is an error executing this line: > INSERT INTO test VALUES(3,'test3',3); > > But the transaction is not stopped, or rolled back. > What am i missing? >
The default behaviour of the sqlite3 shell when a statement encounters an error is to continue executing the remaining statements. Try sqlite3.exe -bail and instead it will stop at the first error. In that case the COMMIT statement is never executed so the statements within the half-finished transaction don't take effect. The DELETE of course remains effective - it is done and dusted by the time the transaction starts. -Rowan

