In Release It! , Майкл Найгард объясняет, что многие катастрофические сбои системы часто бывают вызваны цепью ошибок. Например, два потока тупиковые. Теперь в пуле потоков на два потока меньше, поэтому нагрузка на другие потоки увеличивается, увеличивая их вероятность взаимоблокировок. Внезапно сервер вообще не отвечает, поскольку пул потоков исчерпан, что приводит к тому, что балансировщик нагрузки перенаправляет трафик на другие серверы (на которых выполняется один и тот же код), что увеличивает их вероятность тупики. Внезапно вся ферма не работает.
Большинство серверов RDBMS обнаруживают взаимоблокировки и определяют «проигравшего» (одна транзакция прерывается, другая может продолжаться). Напротив, в C # оператор lock будет бесконечно ждать получения блокировки.
Однако вы можете вызвать Monitor.TryEnter (lockObject, TimeSpan) , чтобы запросить блокировку или тайм-аут. Он возвращает false, если время ожидания истекло и блокировка не может быть получена. Некоторые включили это в операторы , чтобы сохранить хороший синтаксис.
Итак, мой вопрос: вы всегда получаете блокировки, используя таймауты, или нет? И какие проблемы создают таймауты по сравнению со сценарием тупика?