In Release It! begründet Michael Nygard, dass viele katastrophale Systemausfälle oft durch eine Kette von Dingen verursacht werden, die schief gehen. Zum Beispiel, zwei Threads Deadlock. Es gibt jetzt zwei weniger Threads im Thread-Pool, so dass die Last bei den anderen Threads steigt und die Wahrscheinlichkeit von Deadlocks steigt. Plötzlich reagiert der Server überhaupt nicht mehr, weil der Thread-Pool erschöpft ist, was dazu führt, dass der Lastenausgleich den Datenverkehr auf die anderen Server umleitet (die alle den gleichen Code ausführen), was die Wahrscheinlichkeit von Deadlocks erhöht. Plötzlich ist die ganze Farm offline.Sollten Sie Timeouts für Sperren in .NET anfordern?
Die meisten RDBMS-Server erkennen Deadlocks und entscheiden über einen "Verlierer" (eine Transaktion wird abgebrochen, die andere kann fortfahren). Im Gegensatz dazu wird in C# die Sperre Anweisung unbegrenzt auf eine Sperre warten, die erworben werden soll.
Sie können jedoch Monitor.TryEnter(lockObject, TimeSpan) anrufen, um eine Sperre oder Timeout anzufordern. Es gibt false zurück, wenn das Zeitlimit abgelaufen ist und die Sperre nicht erlangt werden konnte. Einige haben wrapped this in using statements, um eine nette Syntax zu behalten.
Also meine Frage ist, erhalten Sie immer Sperren mit Timeouts, oder nicht? Und welche Probleme verursachen Zeitüberschreitungen im Vergleich zu einem Deadlock-Szenario?
Ich denke, die Frage wird, wenn alles, was Sie tun können, eine Fehlermeldung zeigt, ist das besser als unendlich warten? Deadlocks geben Ihnen keine Möglichkeit zum Rollback, und Fehler sind wahrscheinlich eine (geringfügig) bessere Benutzererfahrung als eine eingefrorene Anwendung. –