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


10

我一直想知道为什么Windows Installer只允许您一次安装一个程序。无法启动多个安装非常令人沮丧,尤其是在设置Windows新安装时。是什么原因呢?

Answers:


6

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

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

这些概念在事务数据库中是众所周知的-但该主题并非易事,而且您通常在文件系统中找不到完整的事务基础结构(即使日记文件系统提供了一部分)。一个问题是,多个锁可能导致死锁-然后您需要进行死锁检测(否则两个安装程序都将永远挂起),并提供了一种解决方法。可以避免死锁(例如,始终以相同的顺序锁定文件),但是还有其他问题:

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

然后,您可能必须考虑事务隔离级别-要完全正确,您的事务必须“可序列化” -但这并不容易,即使对于许多数据库也是如此。

甚至可能有替代的策略来解决这些问题,从而避免了完全隔离,但是通常很难证明它们的正确性。

我相信,在并发安装的情况下,安装后我们会遇到很多棘手的问题-尤其是因为我不认为操作系统供应商(或发行版)会经历所有麻烦以使其100%干净。因此,即使操作系统提供了它,我也不愿使用它。

注意

但是也许您真正想要的甚至不是“同时”安装。如果您可以排队等待安装,然后依次执行(理想情况下,不问任何问题),则可能就足够了。确实是这样,其他一些OS(发行版)的处理要好得多。


1
虽然正确,但在我看来,这个答案太冗长了。有人问为什么安装程序服务按其工作方式运行不太可能理解此答案。
gWaldo

2
@gWaldo:好吧,也许您是对的...再说一遍,我不只是想说“这很复杂,请相信我(句点)。无论如何您都不会理解”。也许OP(或其他在这个问题上绊脚石的人)真的很感兴趣,而深入到问题的答案将帮助他估计,如果要解决看起来很简单的事情确实涉及很多复杂性,表面。谁知道?
克里斯·勒彻

非常真实 那是个很好的观点。
gWaldo

尽管所有关于隔离的讨论似乎都是合理的,但如果不使用Windows Installer框架,则可以运行多个安装程序。当并排运行时,我从未遇到任何中断...也许我很幸运:)至于排队安装,有一些工具可以解决这个问题,但是给定多核CPU(哎呀,台式机CPU现在可以运行8个线程了) ...),似乎可以并排运行它们(尽管它们可能仍会为I / O奋斗)。
Rytis

2
@Rytis:我希望我也有同样的运气:-)-即使没有同时运行安装程序,我的安装程序也会随机中断。关于多核:还有另一种利用它们的方法:在一个安装过程中使用多个核。这仍然不总是可能或容易的,但是可以更好地进行协调。总的来说,如果整个安装过程(队列)仅在开始和结束时提出问题,我认为最大的省时方法仍然是。然后,您可以喝咖啡,或在安装运行时进行其他操作(并将其余的核心用于您想做的任何事情。)。
克里斯·勒彻

6

这是设计使然,以避免有两个安装操作相同的文件/文件夹/注册表项/等。它可能以不同的方式完成,但是Microsoft做出了选择。


有任何证据支持您的主张吗?
亚伦·迪古拉

1

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

原因是MSI安装的一部分是作为“事务”运行的-根据事务列表中的操作是否已完成而没有错误地提交或回退了一系列更改。所有操作必须正确完成,然后提交事务,否则将发生所有更改的完整回滚。因此,在任何给定时间只能进行一个这样的事务。

在技​​术MSI级别,仅将InstallExecuteSequence中标准动作InstallInitialize和InstallFinalize之间的动作作为事务运行。在这些动作之外不会发生系统更改,但是有时会错误地设计MSI文件以按其他顺序进行更改。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.