sqlite事务不支持删除
我需要修改表中的所有内容。因此,我将修改封装在事务中,以确保所有操作都成功,或者没有操作成功。我用DELETE语句开始修改,然后是INSERT语句。我发现,即使插入失败,删除仍会发生,并且数据库不会回滚到事务前状态 我创建了一个示例来演示这个问题。将以下命令放入名为EXAMPLE.SQL的脚本中sqlite事务不支持删除,sqlite,Sqlite,我需要修改表中的所有内容。因此,我将修改封装在事务中,以确保所有操作都成功,或者没有操作成功。我用DELETE语句开始修改,然后是INSERT语句。我发现,即使插入失败,删除仍会发生,并且数据库不会回滚到事务前状态 我创建了一个示例来演示这个问题。将以下命令放入名为EXAMPLE.SQL的脚本中 CREATE TABLE A(id INT PRIMARY KEY, val TEXT); INSERT INTO A VALUES(1, “hello”); BEGIN; DELETE
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.dbSQL error near line 10: column id is not unique
1|goodbye
令人惊讶的是,SELECT语句结果没有显示“1 | hello”
似乎删除成功,第一次插入成功。但是当第二次插入失败时(正如预期的那样)…它没有回滚数据库
这是sqlite错误吗?还是我对应该发生什么的理解有误
谢谢它正常工作了
COMMIT
提交事务中的所有操作。涉及world
的一个存在问题,因此未包含在交易中
要取消事务,请使用回滚
,而不是提交
。没有自动的回滚
,除非您将其指定为冲突解决,例如插入或回滚到…
并对字符串文本使用“
单引号而不是”
。显示了导致自动回滚的错误类型:
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
对于其他错误类型,您需要捕获错误并回滚,更多信息将在中介绍。Spot on.Thank.FYI--我使用sqlite命令shell作为概念证明。实际的解决方案将是代码,在这种情况下,我们显然会进行回滚。非常感谢。