sqlite事务不尊重删除

时间:2014-05-06 12:42:13

标签: sqlite

我需要修改表格中的所有内容。所以我将修改包装在一个事务中,以确保所有操作都成功,或者没有。我用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错误吗?或者我对应该发生的事情的理解有误?

由于

2 个答案:

答案 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