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