我正在使用一个iOS应用程序,该应用程序具有一个很大的sqlite数据库,该数据库每天至少获取一次,并且如果事务运行时发生某些情况,我想使用保存点来还原它。

我一直在运行的语句如下:

const char *sqlSetSavePoint = @"savepoint updateSavepoint";

const char *sqlRollback = @"Rollback transaction to savepoint updateSavepoint";

我显然已经省略了许多实际上运行这些语句的代码,但是由于我对其他语句运行相同的方法,并且它们运行良好,因此我确信问题不存在。我在运行插入事务(最多插入20万行)之前设置保存点,然后如果发生异常或错误,我会尝试进行回滚。

我的问题是;这些回滚语句正确(我只是在做错什么)还是在iOS的sqlite3中使用保存点的其他方式?

编辑:为澄清起见,我试图在运行多个事务之前设置一个保存点,如果其中任何一个或从服务器获取数据,失败了,我想完全回滚到保存点。就像这样:
"savepoint updateSavepoint"
    ->FetchDatafromServer()
          -> "Begin exclusive transaction"
               //sqlite3_bind functions
          -> "Commit transaction"
    ->FetchDatafromServer()
          -> "Begin exclusive transaction"
               //sqlite3_bind functions
          -> "Commit transaction"
    ->FetchDatafromServer()
          -> "Begin exclusive transaction"
               //sqlite3_bind functions
          -> "Commit transaction"
    ->FetchDatafromServer()
          -> "Begin exclusive transaction"
              !!Failure!!
"Rollback transaction to savepoint updateSavepoint"

最佳答案

您可以在事务内或其他保存点内使用保存点,但可以使用cannot use transactions inside a savepoint

用保存点替换内部事务。

10-08 14:23