我需要修改表格中的所有内容。所以我将修改包装在一个事务中,以确保所有操作都成功,或者没有。我用DELETE语句开始修改,然后是INSERT。我发现即使INSERT失败,DELETE仍然发生,数据库也没有回滚到事务前状态。
我已经创建了一个示例来演示此问题。将以下命令放入名为EXAMPLE.SQL
的脚本中CREATE TABLE A(id INT PRIMARY KEY, val TEXT);
INSERT INTO A VALUES(1, “hello”);
BEGIN;
DELETE FROM A;
INSERT INTO A VALUES(1, “goodbye”);
INSERT INTO A VALUES(1, “world”);
COMMIT;
SELECT * FROM A;
如果你运行脚本:“sqlite3 a.db< EXAMPLE.SQL“,你会看到:
SQL error near line 10: column id is not unique
1|goodbye
令人惊讶的是SELECT语句结果没有显示'1 | hello'。
看起来DELETE成功了,第一次INSERT成功了。但是当第二次INSERT失败时(原本打算)...。它没有ROLLBACK数据库。
这是一个sqlite错误吗?或者我对应该发生的事情的理解有误?
由于
答案 0 :(得分:3)
它可以正常工作。
COMMIT
提交事务中的所有操作。涉及world
的问题存在问题,因此未包含在交易中。
要取消交易,请使用ROLLBACK
,而不是COMMIT
。没有自动ROLLBACK
除非您将其指定为冲突解决方案,例如INSERT OR ROLLBACK INTO ...
。
使用'
单引号代替“
表示字符串文字。
答案 1 :(得分:0)
This documentation显示导致自动回滚的错误类型:
SQLITE_FULL: database or disk full
SQLITE_IOERR: disk I/O error
SQLITE_BUSY: database in use by another process
SQLITE_NOMEM: out or memory
SQLITE_INTERRUPT: processing interrupted by application request
对于其他错误类型,您需要捕获错误和回滚,有关详细信息,请参阅this SO question。