リリースイット!、Michael Nygard は、壊滅的なシステム障害の多くは、一連の不具合が原因であることが多いと説明しています。たとえば、2 つのスレッドがデッドロックします。スレッド プール内のスレッドが 2 つ少なくなったため、他のスレッドの負荷が増加し、デッドロックの可能性が高くなります。突然、サーバーがまったく応答しなくなります。これは、スレッド プールが使い果たされ、ロード バランサーが他のサーバー (すべて同じコードを実行している) にトラフィックを迂回させ、デッドロックの可能性を高めるためです。突然、ファーム全体がオフラインになります。
ほとんどの RDBMS サーバーはデッドロックを検出し、「敗者」を決定します (一方のトランザクションは中止され、もう一方は続行できます)。対照的に、C# では、lockステートメントはロックが取得されるまで無期限に待機します。
ただし、Monitor.TryEnter(lockObject, TimeSpan)を呼び出して、ロックまたはタイムアウトを要求することはできます。タイムアウトが経過し、ロックを取得できなかった場合は false を返します。これを using ステートメントでラップして、適切な構文を維持するものもあります。
私の質問は、常にタイムアウトを使用してロックを取得しますか? また、デッドロック シナリオと比べて、タイムアウトはどのような問題を引き起こすのでしょうか?