【发布时间】:2010-01-05 21:20:49
【问题描述】:
短版
如果我的进程在事务中间终止,或者在 SQLite 提交事务时,数据库文件损坏的可能性有多大?
加长版
我的应用程序使用 SQLite 数据库进行存储(直接,而不是通过 Core Data)。我正在开发一个新版本的应用程序,它需要更新数据库模式。启动时,应用程序将检查数据库,如果需要更新,则执行一系列 SQL 语句。
根据数据库中的数据量,更新可能会长时间运行(以秒为单位),所以我需要考虑在更新完成之前进程可能被终止的可能性。 (对于上下文,这在 iPhone 上,处理器很慢,应用程序可能会因来电而终止。)当然,我会将升级 SQL 语句包装在事务中。这足以保证数据库不会损坏吗?
我假设事务按照宣传的方式工作,并且如果进程在事务中间终止,则文件将正常。但我也假设在 COMMIT 期间有一个时间窗口可能会出错。
为了安全起见,我可以在开始更新之前创建数据库文件的备份副本,但如果事务是安全的,那么这将是矫枉过正。它还会使更新过程花费更长的时间,这增加了它被中断的机会,然后我不得不考虑文件复制操作可能会被中断......我想保持代码尽可能简单(但并不简单)。
在研究这个问题的过程中,我开始阅读“Atomic Commit In SQLite”,这比我可能需要知道的更详细,但让我相信我不需要事后猜测 SQLite 的能力保护数据库文件。但我仍然希望听到 Stack Overflow 的消息:交易是否足够好,还是我应该更加谨慎?
【问题讨论】:
标签: iphone transactions sqlite