我一直想知道为什么 Windows Installer 只允许您一次安装一个程序。无法启动多个安装非常令人沮丧,尤其是在设置新 Windows 安装时。这是什么原因呢?
答案1
当同时进行安装时,保证正确性将非常复杂 - 假设它们共享一些文件。这将需要某种形式的交易。
- 您需要锁定文件
- 如果安装失败,应该可以撤消中间更改(不确定现在可以吗?)
这些概念来自事务数据库 - 但这个话题并不简单,而且您通常无法在文件系统中找到完全事务性的基础结构(即使日志文件系统提供了其中的一部分)。一个问题是,多个锁可能导致死锁 - 那么您需要死锁检测(否则两个安装程序都会永远挂起),以及一种处理它的方法。可以避免死锁(例如,通过始终以相同的顺序锁定文件),但还有其他问题:
如果您预先锁定所有必需的文件,那么您实际上得到的结果是:一个安装程序必须等待另一个安装程序完成。如果您不预先锁定所有必需的文件并继续进行,则“事务”可能会失败。这意味着,其中一个安装程序必须重新启动。
然后你可能不得不考虑事务隔离级别——要完全正确,你的事务必须是“可序列化”- 但这并不容易,即使对于许多数据库来说也是如此。
甚至可能存在解决这些问题的替代策略,从而绕过完全隔离,但证明其正确性通常更加困难。
我相信,如果使用并发安装,我们将面临更多棘手的安装后问题 - 尤其是因为我不认为操作系统供应商(或发行版)会不遗余力地确保其 100% 清洁。因此,即使操作系统提供了并发安装,我也宁愿不使用它。
笔记
但也许您真正想要的甚至不是“同时”安装。如果您可以将安装排队,然后一个接一个地执行(理想情况下,中间不会询问任何问题),那么这也许就足够了。这确实是一件好事,其他一些操作系统(发行版)处理得更好。
答案2
这是设计使然,为了避免两个安装操作相同的文件/文件夹/注册表项/等等;它可能可以通过不同的方式完成,但微软做出了这个选择。
答案3
并发:您可以使用批处理文件快速依次启动多个 MSI 文件进行安装。您不能同时运行两个 MSI 文件,因为它们会同时写入磁盘。
交易与回滚:原因是 MSI 安装的一部分是作为“事务”运行的 - 一系列更改,这些更改要么提交,要么回滚,具体取决于事务列表中的操作是否无错误完成。所有操作都必须无错误完成,然后事务才会提交,否则将完全回滚所有更改。因此,在任何给定时间只能有一个这样的事务处于活动状态。
技术序列:在技术 MSI 级别,只有标准操作之间的操作InstallInitialize
和InstallFinalize
在里面InstallExecuteSequence
作为事务运行。除了这些操作之外,不应发生任何系统更改,但有时 MSI 文件被错误地设计为在其他序列中进行更改。
链接:
- 更详细的解释。
- 有关 MSI 和互斥锁的更多信息。
- 使用 PowerShell 并行安装软件。
- 提升 MSI 安装的权限(临时管理权限)。