Answers:
并发安装发生时,要保证正确性将非常复杂-假设它们共享一些文件。这将需要某种形式的交易。
这些概念在事务数据库中是众所周知的-但该主题并非易事,而且您通常在文件系统中找不到完整的事务基础结构(即使日记文件系统提供了一部分)。一个问题是,多个锁可能导致死锁-然后您需要进行死锁检测(否则两个安装程序都将永远挂起),并提供了一种解决方法。可以避免死锁(例如,始终以相同的顺序锁定文件),但是还有其他问题:
如果您预先锁定了所有必需的文件,则可以有效地获得所拥有的:一个安装程序必须等到另一个安装程序完成为止。如果您没有预先锁定所有必需的文件并继续进行,则可能会导致“事务”失败。这意味着必须重新启动其中一个安装程序。
然后,您可能必须考虑事务隔离级别-要完全正确,您的事务必须“可序列化” -但这并不容易,即使对于许多数据库也是如此。
甚至可能有替代的策略来解决这些问题,从而避免了完全隔离,但是通常很难证明它们的正确性。
我相信,在并发安装的情况下,安装后我们会遇到很多棘手的问题-尤其是因为我不认为操作系统供应商(或发行版)会经历所有麻烦以使其100%干净。因此,即使操作系统提供了它,我也不愿使用它。
注意
但是也许您真正想要的甚至不是“同时”安装。如果您可以排队等待安装,然后依次执行(理想情况下,不问任何问题),则可能就足够了。确实是这样,其他一些OS(发行版)的处理要好得多。
您可以踢几个MSI文件,然后使用批处理文件依次快速安装。您不能同时运行两个MSI文件,因为它们都同时写入磁盘。
原因是MSI安装的一部分是作为“事务”运行的-根据事务列表中的操作是否已完成而没有错误地提交或回退了一系列更改。所有操作必须正确完成,然后提交事务,否则将发生所有更改的完整回滚。因此,在任何给定时间只能进行一个这样的事务。
在技术MSI级别,仅将InstallExecuteSequence中标准动作InstallInitialize和InstallFinalize之间的动作作为事务运行。在这些动作之外不会发生系统更改,但是有时会错误地设计MSI文件以按其他顺序进行更改。