【问题标题】:Upgrade SQLite Database with Transactions使用事务升级 SQLite 数据库
【发布时间】:2015-04-30 16:25:37
【问题描述】:

我有一个网站解决方案,用于每个租户帐户的 SQLite 数据库。没有深入探讨我们选择此解决方案的原因,我们选择它是因为 SQLite 支持分布式/离线系统。

所有数据库都使用相同的 PHP 文件结构进行操作。我希望为所有帐户迭代更新数据库版本,以便它们都处于相同的版本号。

我有一个循环遍历每一个的脚本,并且可以使用 PHP(Yii) 或 shell 来执行查询。

我想将对每个数据库的操作封装在一个事务中。看起来 DDL 命令在本质上可能已经是自动提交的。

问题:如何完成 SQLite DB 升级,如果升级失败,将报告失败?使用该报告,我可以提示系统重新尝试或向管理员报告错误。理想情况下,我想将整个升级包装在一个事务中以防止不一致,但我相当确定这是不可能的。

我的一个想法是在升级期间临时备份数据库,并在成功时将其删除。

【问题讨论】:

  • 在 SQLite 中,DDL 命令是完全事务性的。
  • 因此,不可能用“全局”事务包装 DDL。问题是,我可能需要以原子方式执行许多 DDL 和查询。看起来更像是在执行更新之前备份数据库可能是最好的选择,并在重新尝试升级之前恢复到备份。
  • “事务”意味着它们可以像任何其他 SQL 命令一样被包装在事务中。
  • 太棒了,感谢您的提示。将报告成功,因为看起来每次升级确实可以包含在事务中。

标签: sqlite transactions version upgrade


【解决方案1】:

正如 cmets 中的 CL 所述,DDL 在 SQLite 中是完全事务性的。因此,对于我们系统中的每个数据库,我们将其包装在一个事务中,并以原子方式执行。我们利用该应用程序确保所有数据库在升级过程中失败时都能成功升级。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    相关资源
    最近更新 更多