代码之家  ›  专栏  ›  技术社区  ›  benzado

我应该相信SQLite事务以避免文件损坏吗?

  •  6
  • benzado  · 技术社区  · 16 年前

    短版

    如果我的进程在事务中间终止,或者当sqlite提交事务时,数据库文件损坏的可能性有多大?

    长版

    我的应用程序使用一个sqlite数据库进行存储(直接,而不是通过核心数据)。我正在开发一个新版本的应用程序,它需要更新数据库模式。启动时,应用程序将检查数据库,如果需要更新,则执行一系列SQL语句。

    根据数据库中的数据量,更新可能会长时间运行(以秒为顺序),因此我需要考虑在更新完成之前终止进程的可能性。(对于上下文,这是在iPhone上进行的,在iPhone上,处理器速度很慢,应用程序可能会被来电终止。)当然,我会在事务中包装升级SQL语句。这是否足以保证数据库不会损坏?

    我假设事务按广告的方式工作,并且如果进程在事务中间终止,那么文件就可以了。但我也假设在提交过程中有一个时间窗口,在这个窗口中可能会出现问题。

    为了安全起见,我 能够 在开始更新之前创建数据库文件的备份副本,但是如果事务是安全的,那么这将是多余的。它还将使更新过程花费更长的时间,这增加了它被中断的机会,然后我将不得不考虑文件复制操作可能被中断…我希望代码尽可能简单(但不简单)。

    在研究这个问题的过程中,我已经开始阅读了。” Atomic Commit In SQLite “,这比我可能需要知道的要详细,但让我相信我不需要再猜测sqlite保护数据库文件的能力。但我还是想听听堆栈溢出的消息: 交易是否足够好,还是应该更加谨慎?

    2 回复  |  直到 16 年前
        1
  •  7
  •   Craig    16 年前

    我读过 Atomic Commit in SQLite 文件。如果您真的想了解正在发生的事情,这可能不是过分杀伤力,但简而言之,一个事务是这样进行的:

    1. 锁定数据库文件
      • 创建回滚日志
        1. 确定数据库文件的哪些部分将要更改
      • 将这些页的副本写入日志文件
      • 写入日志文件头
      • 将预期的更改写入数据库文件
      • 删除回滚日志( 这是承诺 )

    当用户完成与MOM的对话并重新启动应用程序时,当它尝试打开数据库文件时,如果存在回滚日志,它将使用类似安全的过程将原始数据写回数据文件。即使您丢失了您的事务,并且丢失了一个回滚,一旦妈妈的神经崩溃被正确阻止,并且他可以一次运行应用程序超过几秒钟,它最终也会得到处理。

    如果是我,我会相信这些交易。由于有这么多的sqlite用户,即使是在嵌入式应用中,我认为如果事务提交失败不能正常工作,那么它将是整个网络上非常热门的话题。

        2
  •  1
  •   beinstein    16 年前

    您是否将coredata与sqlite后端一起使用?如果是这样,我实际上发现处理这个问题的最佳方法是创建两个单独的nsmanagedObjectContext(只读和编辑)。当过程完成时,只需保存“编辑”上下文,两个上下文就会同步。如果在操作过程中发生了什么事情,编辑上下文将不会被保存,所以您会没事的。

    推荐文章