【发布时间】:2015-04-30 16:25:37
【问题描述】:
我有一个网站解决方案,用于每个租户帐户的 SQLite 数据库。没有深入探讨我们选择此解决方案的原因,我们选择它是因为 SQLite 支持分布式/离线系统。
所有数据库都使用相同的 PHP 文件结构进行操作。我希望为所有帐户迭代更新数据库版本,以便它们都处于相同的版本号。
我有一个循环遍历每一个的脚本,并且可以使用 PHP(Yii) 或 shell 来执行查询。
我想将对每个数据库的操作封装在一个事务中。看起来 DDL 命令在本质上可能已经是自动提交的。
问题:如何完成 SQLite DB 升级,如果升级失败,将报告失败?使用该报告,我可以提示系统重新尝试或向管理员报告错误。理想情况下,我想将整个升级包装在一个事务中以防止不一致,但我相当确定这是不可能的。
我的一个想法是在升级期间临时备份数据库,并在成功时将其删除。
【问题讨论】:
-
在 SQLite 中,DDL 命令是完全事务性的。
-
因此,不可能用“全局”事务包装 DDL。问题是,我可能需要以原子方式执行许多 DDL 和查询。看起来更像是在执行更新之前备份数据库可能是最好的选择,并在重新尝试升级之前恢复到备份。
-
“事务”意味着它们可以像任何其他 SQL 命令一样被包装在事务中。
-
太棒了,感谢您的提示。将报告成功,因为看起来每次升级确实可以包含在事务中。
标签: sqlite transactions version upgrade