Я использую Eclipselink и Spring для управления транзакциями. Я хочу, чтобы программа вставляла два набора основных / подробных записей атомарно, так что либо оба, либо ни один.
Теперь, если моя явная проверка не удалась, либо структура, код выдает исключение, и откат для этого позаботится. Ошибка, возникшая во время обработки второй записи, откатывает первую.
Если все становится грушевидным, это ошибка данных при обработке второй транзакции, которая приводит к SQLException во время процесса очистки / фиксации. В этом случае кажется, что откатывается только вторая запись, первая остается в место.
Я пробовал разные твики. Исключение SQLException обычно запускается во время вызова поиска во время процесса проверки записи, когда это генерирует flush (), но я попытался изменить настройки EntityManger, чтобы отключить эту автоматическую очистку, и хотя другое исключение выдается при В другом месте программы откат все равно делает то же самое.
Я пытался запросить новую транзакцию для обновления, которое выдает ошибку, но система говорит, что в этот момент она не может дать мне новую транзакцию.
Я пытался выполнить сброс непосредственно перед концом транзакции в надежде перехватить исключение DatabaseException и преобразовать его в исключение для отката.
Теперь я могу более разборчиво относиться к проверке, уменьшая вероятность ошибок данных в SQL, но я бы предпочел застраховаться от того, чтобы что-то пропустить. Я могу исправить юнит-тест таким образом, но наверняка найдутся и другие способы.
О, установка режима очистки на «COMMIT» действительно имеет значение. В этом случае ни одна запись не будет откатана. Даже если я перехватываю исключение PersistenceException и вместо этого выбрасываю свой откат для исключения.