SQLite C接口:如果事务回滚失败怎么办?

SQLite C接口:如果事务回滚失败怎么办?,sql,database,sqlite,transactions,rollback,Sql,Database,Sqlite,Transactions,Rollback,我为一个利用SQLite的项目编写了大量API,其方法如下: sqlite3_exec(mydatabase, "BEGIN;", nullptr, nullptr, nullptr); /* perform several INSERT, SELECT, UPDATE, DELETE queries on the database */ if(/* problem detected */){ sqlite3_exec(mydatabase, "ROLLBACK;", nullptr,

我为一个利用SQLite的项目编写了大量API,其方法如下:

sqlite3_exec(mydatabase, "BEGIN;", nullptr, nullptr, nullptr);
/* perform several INSERT, SELECT, UPDATE, DELETE queries on the database */
if(/* problem detected */){
    sqlite3_exec(mydatabase, "ROLLBACK;", nullptr, nullptr, nullptr);
} else {
    sqlite3_exec(mydatabase, "COMMIT;", nullptr, nullptr, nullptr);
}
我的问题是:如果rollback语句失败会发生什么?我想我可以检查commit语句的返回值,并在出现错误时回滚,但我不知道如果回滚失败该怎么办

此外,我已经编写了我的代码,假设我可以执行以下操作:

sqlite3_exec(mydatabase, "BEGIN;", nullptr, nullptr, nullptr);
/* INSERT data in the database */
/* UPDATE or SELECT records in the database where the record could be a record already stored in the db
or a record inserted with the INSERT statement above */
if(/* problem detected */){
    sqlite3_exec(mydatabase, "ROLLBACK;", nullptr, nullptr, nullptr);
} else {
    sqlite3_exec(mydatabase, "COMMIT;", nullptr, nullptr, nullptr);
}
因此,基本上我假设如果我启动一个事务,在db中更改某些内容并在db中搜索修改过的行,即使事务仍在运行且尚未发出提交,该更改也会立即可见。这是正确的吗


感谢在相同连接(即相同进程和相同连接对象)的上下文中,在事务内部对数据库所做的所有更改对同一事务中的后续语句可见。事务的全部目的是累积相关更改,然后一次性提交所有更改或一起拒绝(即回滚)所有更改。如果不是这样,交易的全部目的将无效


如果回滚失败,则应检查并相应地处理该情况。并非所有故障都表明数据库存在严重问题

以前提交和/或回滚的事务无法再次回滚,因此将导致错误。这表明存在某种类型的逻辑/流错误,但不一定是数据库完整性问题。但是,如果代码的一部分尝试回滚,但事务已经提交,则根据您的特定需求和业务逻辑,数据可能处于无效状态。只有您可以决定如何处理此类错误。修复一个bug?忽略错误

SQLITE_BUSY的错误代码意味着另一个连接暂时锁定了数据库,因此它也可能阻止回滚(这一点不确定)。简单的延迟和重试就足以处理此问题


其他错误可能表示更严重的问题,如数据库连接丢失或日志文件损坏等。您认为这完全取决于您的应用程序,以及数据库对应用程序的重要性。错误是否应该升级并终止整个程序?只是记录并忽略?也许您的代码可以进一步分析连接和/或数据库文件并尝试恢复?

谢谢。我的数据库对于我的应用程序是绝对必要的。基本上,我使用数据库存储有关用户、组(用户)和密钥管理系统的元数据,我正在使用自定义硬件安全模块开发密钥管理系统。如果我丢失了数据库,我将丢失KMS中的所有信息,但安全存储在HSM闪存中的密钥除外。数据库一次只能由一个用户在本地访问,因此我不会有任何并发问题(处理数据库的软件是单线程的,它不会对数据库执行任何嵌套操作)。此外,我可以说,我的应用程序逻辑中没有可能导致已提交事务回滚或类似错误操作的错误。我主要担心的是,在执行事务提交或回滚之前,突然出现应用程序崩溃、电源故障、HSM与pc断开连接以及类似事件。@matteof93总是有可能出现突然硬件故障,从而导致数据库损坏。这些问题的解决方案不是事务,而是数据备份、冗余电源、冗余存储等。。。基本上与交易讨论无关。您专门询问了回滚期间的失败,因此答案是原样的。sqlite的设计目的是在出现故障时保持数据的完整性,但我无法告诉您如何处理Transaction处理本身的故障。我提出了一些问题来提示可能的解决方案,你可能会对阅读感兴趣