我一直想知道为什么 Windows Installer一次只允许您安装一个程序.如果不能启动多个安装,尤其是在设置Windows的新安装时,这是非常令人沮丧的.这是什么原因?
当并发安装发生时,保证正确性是非常复杂的 – 假设它们共享一些文件.这需要某种形式的交易.

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

这些概念在事务性数据库中是已知的 – 但主题并不简单,并且您通常在文件系统中找不到完全事务性的基础结构(即使日记文件系统提供了其中的一部分).一个问题是,多个锁可能导致死锁 – 然后您需要死锁检测(或两个安装程序将永远挂起),以及一种处理它的方法.可以避免死锁(例如,始终以相同的顺序锁定文件),但还有其他问题:

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

然后你可能不得不考虑事务隔离级别 – 完全正确,你的事务必须是“serializable” – 但这并不容易,即使对于许多数据库也是如此.

甚至可能存在处理问题的替代策略,这避免了完全隔离,但通常更难以证明其正确性.

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

注意

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

windows-installer – 为什么Windows Installer一次只能安装一个程序?的更多相关文章

  1. ios – 如何在使用自动可再生应用内购买时恢复正确的交易?

    这个问题是关于自动再生IAP的问题,以及如何恢复.这些链接:this和this没有帮助我不幸.在我的应用程序中,我有用户订阅自动可再生应用内购买.他们可以订阅1,6或12个月.当他们订阅时,交易收据将发送到我的服务器以备以后验证.我不会立即验证收据,因为它会减慢用户体验(对苹果服务器的收据验证查询大约需要1–2秒).相反,我使用天真的方法,并提供用户订阅的内容,无需任何直接的接收验证.我安排一个c

  2. ios – 在核心数据中删除Cascade中的关系对象

    谢谢解决方法如果为Person设置“transactions”关系的“DeletionRule”交易到“级联”,然后删除一个人将自动删除所有相关交易.

  3. ios – SKReceiptRefreshRequest vs restoreCompletedTransactions

    我的应用程序使用订阅模式,我收到投诉,其中一些用户无法通过SKPaymentQueue.restoreCompletedTransactions恢复订阅.他们必须删除应用程序并从AppStore重新下载.我不确定为什么它只发生在一些用户身上,其中一个告诉我他通过itunes取消并重新启动,另一个关于付款问题.那么为什么他们需要重新下载应用程序呢?我猜测一些信息在收据上没有正确刷新,所以我考虑使用S

  4. android – SQLiteException:无法在事务中启动事务(代码1)

    我在完成一个sqlite事务时遇到了问题,我对如何做到这一点感到困惑.它从2007年开始看起来像thisbug.我正在创建我的employee表(引用另一个表实体),如下所示(为简洁起见):然后我按如下方式运行事务(使用sqliteDatabase对象,我还报告日志中事务的状态):好的,一切正常.现在,如果我尝试启动新事务或回滚,则两者都会失败:请注意,如果FK立即而不是延期,则所有这些都不会发生

  5. android – 使用addToBackStack进行Fragment事务后单击后退按钮不会执行任何操作

    解决方法正确的方法是使用onBackpressed()方法捕获应用程序中的返回事件,然后使用popBackStack()“弹出”backStack.例如:PD:很抱歉延迟回答,但我刚看到你的问题.希望能帮助到你!

  6. java SpringBoot 分布式事务的解决方案(JTA+Atomic+多数据源)

    这篇文章主要介绍了java SpringBoot 分布式事务的解决方案(JTA+Atomic+多数据源),文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下

  7. spring学习JdbcTemplate数据库事务管理

    这篇文章主要为大家介绍了spring学习JdbcTemplate数据库事务管理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  8. NodeJs使用Mysql模块实现事务处理实例

    本篇文章主要介绍了NodeJs使用Mysql模块实现事务处理 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. java发送kafka事务消息的实现方法

    本文主要介绍了java发送kafka事务消息的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  10. Spring学习JdbcTemplate数据库事务参数

    这篇文章主要为大家介绍了Spring学习JdbcTemplate数据库事务参数使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部