2015-04-30 126 views
0

我有一个网站解决方案,在每个租户帐户上使用SQLite数据库。没有深入探讨为什么选择这个解决方案,我们之所以选择它,是因为分布式/离线系统上的SQLite支持。使用事务升级SQLite数据库

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

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

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

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

我以为有一个想法是在升级过程中临时备份数据库,并在成功时删除它。

+0

在SQLite中,DDL命令是完全事务性的。 –

+0

因此,用“全局”事务包装DDL是不可能的。事情是,我可能需要很多DDL和查询才能以原子方式执行。看起来更像是在执行更新之前备份数据库可能是最好的选择,并在重新尝试升级之前恢复备份。 – Csizzle

+0

“事务性”意味着它们可以像任何其他SQL命令一样包装在事务中。 –

回答

0

由于CL在评论中声明,DDL在SQLite中是完全事务性的。因此,对于我们系统中的每个数据库,我们将它包装在一个事务中,并且它以原子方式执行。我们利用该应用程序确保所有数据库升级成功(如果升级失败)。