Существует ли альтернатива использованию исключений при передаче конфликтов параллелизма на прикладной уровень, которая также соблюдает принцип Разделение команд и запросов, или исключения — лучший механизм, который у нас есть (в языках, поддерживающих исключения)?
В недрах моего приложения у меня есть оптимистичная логика блокировки, которая выполняется несколькими уровнями ниже, когда я вызываю определенные высокоуровневые методы, например. (в моем случае я использую пользовательский уровень доступа к данным, хотя я, конечно, готов услышать, как это делают реализации ORM). Вызовы методов высокого уровня, с которыми взаимодействует приложение, выглядят следующим образом:
// 'data' is just a placeholder for multiple parameters, including something
// that contains row version information
void Customer.UpdateInformation(object data);
Мне нужно иметь возможность сообщить пользователям веб-приложения, когда кто-то другой обновил данные, над которыми они работают.
Я бы предпочел не возвращать значение из методов, которые изменяют данные. Поэтому в прошлом я выдавал исключения (похожие на API адаптера данных .NET, который выдавал ошибку DBConcurrencyException при обнаружении конфликтов), но конфликты параллелизма, по здравому смыслу, не являются исключительными. Это факт жизни: предсказуемая, ожидаемая часть рабочего процесса приложения. Квалифицируются ли они как экзогенные исключения в исследовании Эрика Липперта? таксономия?