Откат должен быть исключением?(в частности: в веб-приложениях и с OSIV) - PullRequest
2 голосов
/ 14 марта 2012

Это довольно теоретический вопрос:

В моих классах обслуживания я склонен всегда выполнять откат, если операция не может быть выполнена по какой-либо причине, даже если причиной является ложный ввод или любое другое условие, которое ожидается и проверено.

В веб-приложении, использующем шаблон Open Session in View (OSIV), это имеет неприятный побочный эффект: сессия закрывается и любая последующая операция отложенной загрузки завершается неудачно. Я должен написать некрасивый код, чтобы откатить сеанс только в конце запроса, когда в какой-то момент во время запроса произошла ошибка.

Это заставило меня задуматься: должны ли откаты быть исключительной мерой, если что-то действительно пошло не так? Должны ли методы обслуживания самим убедиться, что данные не записываются / не изменяются, если условия не выполняются? Как справиться со случаем, когда интерфейсный слой обновляет объект модели (как в форме), когда проверка ввода прошла успешно, но метод службы решает, что выбранный ввод недопустим? Например, Hibernate сохранит эти изменения автоматически в конфигурации по умолчанию, если откат не выполняется.

Ждем ваших мнений и советов!

1 Ответ

2 голосов
/ 14 марта 2012

По моему мнению, лучше подумать противоположным образом: сначала вы получаете условие ошибки (которое может привести к исключению или просто к нулю), а затем вы решаете, является ли в этом случае ошибкаОткат полезен.

Один очень важный вопрос: кто занимается обработкой транзакций?Это делается вызывающим абонентом ваших служб или в самих службах (это означает, что каждый вызов службы является отдельной транзакцией).

A) Вызывающий объект выполняет обработку транзакции:Тогда служба почти никогда не должна выполнять откат, потому что она также откатит другие операторы, которые вызывающая сторона сделала перед вызовом этой службы.Вызывающий абонент может считать ошибку службы нормальным случаем и продолжить.Для этого случая никакие операторы базы данных не должны быть потеряны.Если вызывающая сторона не может продолжить работу после ошибки, это задача вызывающей стороны - откатить транзакцию.Это означает, что служба не должна записывать неполные данные в базу данных и должна проверять возможные условия ошибки перед записью.Есть два случая, когда откат в сервисе все же может быть полезен:- Условие ошибки определенно является результатом ошибки программирования.- В сервисе потребовалось бы много усилий, чтобы обработать состояние ошибки без отката.В этом случае очень важно задокументировать условие отката в Javadoc, потому что вызывающий должен позаботиться об этом.

B) Служба выполняет обработку транзакций.Каждый сервисный вызов - это отдельная транзакция:Сервис бесплатный, позволяет делать откаты по своему усмотрению.Если служба сначала проверяет условие и не записывает данные или выполняет откат, результат остается тем же и не отображается для вызывающей стороны.Если данные записаны, служба должна выполнить фиксацию или откат.Если выдается исключение, откат настоятельно рекомендуется, поскольку вызывающая сторона не ожидает записи данных в этом случае.

Кстати, если в объекте Session выбрасывается исключение, Hibernate автоматически выполняет откат.

...