为什么Windows Installer一次只能安装一个程序?

我一直在想,为什么Windows Installer只允许你一次安装一个程序。 不能启动多个安装是非常令人沮丧的,特别是在设置Windows的新安装时。 这是什么原因?

当并发安装发生时,保证正确性会非常复杂 – 假设它们共享一些文件。 这将需要某种forms的交易。

  • 你需要locking文件
  • 如果安装失败,应该可以撤消中间的更改(不确定,如果现在可以的话)?

这些概念从事务数据库中是已知的 – 但是这个话题并不是微不足道的,而且通常在文件系统中找不到完全事务性的基础架构(尽pipe日志文件系统提供了这一点)。 一个问题是,多个锁可能导致死锁 – 那么你需要死锁检测(或两个安装程序将永远挂起),以及一种方法来处理。 可以避免死锁(例如总是以相同的顺序locking文件),但还有其他问题:

如果您事先locking了所有需要的文件,则可以有效地获得所需的文件:一个安装程序必须等到另一个安装完成。 如果您没有预先locking所有必需的文件,并继续进行,则可能会导致“交易”失败。 这意味着,其中一个安装程序将不得不重新启动。

那么你可能不得不考虑事务隔离级别 – 要完全正确,你的事务将不得不是“可序列化的” ,但即使对于许多数据库来说也不是那么容易。

甚至可能有其他策略来处理这些问题,这些问题可以避免完全孤立,但通常更难以certificate其正确性。

我相信,在同时安装的情况下,我们会遇到更多棘手的安装后问题 – 特别是因为我不认为OS操作系统供应商(或分销商)会经历所有的麻烦使其100%干净。 所以我宁愿不使用它,即使它是由操作系统提供的。

注意

但是,也许你真正想要的是甚至不安装“在同一时间”。 如果你可以排队安装,然后一个接一个地执行(理想情况下没有问任何问题),也许就足够了。 这真的是一些其他的操作系统(发行版)处理好多了。

这是devise,为了避免有两个安装操纵相同的文件/文件夹/registry项等; 它可能是以不同的方式完成的,但微软做出了这个select。

您可以踢几个MSI文件,使用batch file依次快速安装。 您不能同时运行两个MSI文件,因为它们都同时写入磁盘。

原因是MSI安装的一部分是作为一个“事务”运行的 – 一系列的改变,根据事务列表中的操作是否完成没有错误,提交或回滚。 所有必须完成没有错误,然后交易承诺,否则发生所有更改的完全回滚。 因此,在任何时候只有一个这样的交易是活跃的。

在技​​术MSI级别,只有在InstallExecuteSequence中的标准操作InstallInitialize和InstallFinalize之间的操作作为事务运行。 这些操作之外没有系统更改发生,但有时MSI文件被错误地devise为在其他序列中进行更改。