Я думаю, что вы подходите разумно, и вам обязательно стоит попробовать блокировку на уровне строк, если это возможно.
Возможно, вы захотите пересмотреть свой дизайн. Является ли база данных дублирующим состоянием, которое действительно исходит от веб-службы? В этом случае вы можете рассмотреть возможность кэширования вызовов веб-службы. Но это зависит от вашего приложения.
В качестве альтернативы вам, возможно, придется просто свернуть свое собственное управление транзакциями. Пока это универсально, это не должно быть слишком много проблем. Мы сделали это в нашем проекте, где мы не используем транзакции Spring. Что-то вроде
performTransaction() {
doWSCall();
// no need to worry about WS call exception, because DB call won't happen
try {
doDbCall()
} catch (Exception ex) {
rollbackWSCall()
// rethrow ex
}
}
где все методы абстрактные.