なぜWindowsインストーラーは一度に1つのプログラムしかインストールできないのですか?


10

Windowsインストーラーで一度に1つのプログラムしかインストールできないのはなぜかといつも思っていました。特にWindowsの新規インストールをセットアップする場合、複数のインストールを起動できないのは非常にイライラします。その理由は何ですか?

回答:


6

同時インストールが行われる場合、正確性を保証することは非常に複雑です-それらがいくつかのファイルを共有していると仮定します。これには何らかの形のトランザクションが必要になります。

  • ファイルをロックする必要があります
  • インストールが失敗した場合、中間の変更を元に戻すことが可能であるべきです(不可能な場合、それが現在可能かどうか)。

これらの概念はトランザクションデータベースで知られていますが、トピックは簡単ではなく、通常、ファイルシステムに完全なトランザクションインフラストラクチャはありません(ジャーナルファイルシステムがその一部を提供している場合でも)。1つの問題は、複数のロックがデッドロックにつながる可能性があることです。デッドロックの検出(または両方のインストーラーが永久にハングする)と、それを処理する方法が必要です。デッドロックは回避できますが(たとえば、常に同じ順序でファイルをロックすることにより)、他の問題があります。

必要なすべてのファイルを事前にロックすると、所有しているものを効果的に取得できます。一方のインストーラーは、もう一方が完了するまで待機する必要があります。必要なすべてのファイルを事前にロックせずに続行すると、「トランザクション」が失敗する危険があります。つまり、インストーラーの1つを再起動する必要があります。

次に、トランザクション分離レベルについて考える必要があるかもしれません-完全に正しくするには、トランザクションを「シリアライズ可能」にする必要があります-しかし、それは、多くのデータベースであっても簡単ではありません。

完全な分離を回避する問題に対処するための代替戦略もあるかもしれませんが、通常、それらの正当性を証明することはさらに困難です。

同時インストールの場合、インストール後の問題がさらに扱いにくくなると思います。特に、OSベンダー(またはディストリビューション)が100%クリーンにするためにすべてのトラブルを経験することはないと思います。そのため、たとえOSから提供されたとしても、使用しない方がよいと思います。

注意

しかし、おそらくあなたが本当に望んでいるのは、「同時に」インストールすることさえないでしょう。インストールをキューに入れて次々に実行することができれば(理想的には、間に質問をせずに)十分かもしれません。そして、それは本当に何かであり、他のいくつかのOS(ディストリビューション)ははるかによく処理します。


1
この答えは正しいですが、私には冗長すぎるようです。インストーラーサービスがなぜそのように機能するのかと尋ねる人は、この答えを理解できないでしょう。
gWaldo 2010

2
@gWaldo:わかりました、多分あなたは正しいかもしれません...それから、私は単に「それは複雑です、私を信じてください(期間)。とにかくあなたはそれを理解しないでしょう」と言いたくない。たぶんOP(またはこの質問につまずく他の誰か)が本当に興味を持っている、そして問題の底になる答えがありますならば、彼は推定するのに役立ちます本当にそのルックスので、簡単にその上で何かを解決するために伴う複雑さの多くは、表面。知るか?
Chris Lercher、2010

とても本当です。それは良い点です。
gWaldo 2010

分離に関する話はすべてもっともらしいようですが、Windowsインストーラフレームワークを使用しない場合は、複数のインストーラを実行できます。並べて実行しているときにそれらが壊れることはありませんでした...たぶん私は幸運なだけかもしれません:)インストールのキューイングに関しては、そのためのツールがありますが、マルチコアCPU(ヘック、デスクトップCPUは8つのスレッドを実行できるようになりました) ...)、それらを並べて実行することが答えになると思われます(ただし、I / Oのためにまだ競合する可能性があります)。
Rytis 2010

2
@Rytis:同じ運が良ければいいのに:-)-インストーラを同時に実行していなくても、ランダムに壊れてしまいました。マルチコアについて:それらを使用する別の方法があります:1つのインストールプロセス内で複数のコアを使用する。それはまだ常に可能であるか簡単であるとは限りませんが、よりよく調整することができます。全体として、インストールプロセス全体(キュー)が最初と最後にしか質問しない場合、最大の時間節約はまだあると思います。その後、コーヒーを入手したり、インストールの実行中に他のことを実行したりできます(そして、残りのコアを何でもやりたいことに利用します)。
Chris Lercher、2010

6

これは、2つのインストールで同じファイル/フォルダ/レジストリキーなどを操作することを避けるための仕様です。それはおそらくさまざまな方法で行われた可能性がありますが、マイクロソフトがこの選択を行いました。


あなたの主張を裏付ける参照はありますか?
Aaron Digulla

1

複数のMSIファイルをキックして、バッチファイルを使用して次々にインストールできます。両方が同時にディスクに書き込むという意味で、2つのMSIファイルを同時に実行することはできません。

その理由は、MSIインストールの一部が「トランザクション」として実行されるためです。トランザクションリストのアクションがエラーなしで完了したかどうかに応じて、コミットまたはロールバックされる一連の変更です。すべてがエラーなしで完了する必要があり、その後トランザクションがコミットされます。それ以外の場合は、すべての変更の完全なロールバックが発生します。したがって、一度にアクティブにできるトランザクションは1つだけです。

技術的なMSIレベルでは、InstallExecuteSequenceの標準アクションInstallInitializeとInstallFinalizeの間のアクションのみがトランザクションとして実行されます。これらのアクション以外ではシステムの変更は発生しないはずですが、MSIファイルは誤って他のシーケンスを変更するように設計されている場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.