2017-01-11 5 views
0

В каждом источнике, который я видел, транзакция определяется как набор операций, которые успешно или сбой вместе. Однако использование EntityManager в JPA, похоже, требует транзакции даже для сохранения единственного объекта, который я создал в памяти. В чем смысл транзакции? Разве эта операция не является атомной? Как я могу откат одного entity.persist()? Есть ли четкое определение концепции в любом месте документации Java EE?Что такое транзакция в java EE?

+1

Там тонны чтения на это, на самом деле , https://en.wikibooks.org/wiki/Java_Persistence/Transactions – lexicore

+1

спасибо. проблема в том, что я читал тонну, но все же даже ссылка определяет транзакцию как «набор операций». почему я должен * использовать его для одного объекта entity.persist? –

+0

Кто сказал, что вам нужно? – lexicore

ответ

2

Думая, что EntityManager.persist() является атомарным, как всегда, используя SQL с включенным автоматическим фиксацией. Транзакция используется для создания атомарной операции, которая позволяет вставить одну или несколько строк в одну или несколько таблиц как единую операцию атома, либо вставляется, либо ничего не вставлено.

Если у вас нет транзакции, и вы вставляете пользователя и его два телефонных номера (две таблицы), и что-то не так, когда вы вставляете второй номер телефона, вы хотите, чтобы вся транзакция завершилась неудачей, а не противоречивые данные.

Если вы используете управляемый приложением EntityManager, вы контролируете транзакцию progammaticrally (EntityManager.getTransaction()), поэтому вы контролируете, какие операции (вставки/обновления) должны выполняться как атомная операция.

Если вы используете управляемый контейнером EntityManager (Spring, JavaEE), то транзакция является декларативной (аннотация @Transactional), поэтому транзакции в основном относятся к методу (обычно распространяются через вызовы нескольких методов).

Это только верхушка айсберга, когда речь идет о сделках, есть и другие вещи, как уровни изоляции и сериализованная транзакций, но позволяет переговоры о том, что в другой раз :)

1

Не является ли эта операция уже атомной? Как я мог откат одного entity.persist()?

Это может быть или не быть атомарным. Например, если ваша организация имеет отношение к другому объекту с CascadeType.PERSIST или использует вторичную таблицу, для ее сохранения потребуется более одного оператора SQL.

На самом деле нет однозначного сопоставления между вызовами и операторами SQL, причем оба из них не должны совпадать по времени.

Смежные вопросы