Транзакции (свойство атомарности) в EJB 3 применяются только к операциям с базой данных. Я прав?

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

Например, если methodOne() methodTwo() methodThree() объединяются в одну транзакцию, если какой-либо из методов дает сбой, вся операция откатывается. Откат приведет к откату на уровне базы данных, и в результате база данных будет приведена в состояние, в котором она была до транзакции.

Но что, если методы внесли изменения в переменные состояния или статические переменные или записали некоторые файлы в файловой системе? Насколько я понимаю, «откат» не применяется к таким изменениям, не относящимся к базе данных, и что эти изменения не отменяются. Правильно ли я понимаю?


person stratwine    schedule 01.07.2010    source источник


Ответы (3)


Транзакции (свойство атомарности) в EJB 3 применяются только к операциям с базой данных. Я прав?

Нет, ты не такой. Транзакции применяются к транзакционным ресурсам. Спецификация Java EE признает три типа транзакционных ресурсов: базы данных JDBC, адресаты JMS и «другие транзакционные сервисы, доступ к которым осуществляется через JCA».

Но что, если методы внесли изменения в переменные состояния или статические переменные или записали некоторые файлы в файловой системе?

Это не транзакционные ресурсы (если только вы не записываете в файловую систему через коннектор JCA на потом).

person Pascal Thivent    schedule 01.07.2010
comment
Для поддержки транзакций XA файловой системы (с JCA или без него) см. xdisk. - person Nitin Verma; 10.02.2012

Ресурсы файловой системы не являются транзакционными. Таким образом, вам придется откатить ваши изменения. Или вам придется взглянуть на адаптеры ресурсов файловой системы, предоставляемые контейнерами.

person ring bearer    schedule 01.07.2010
comment
Благодарность ! адаптеры ресурсов для меня новы. Проверим :) - person stratwine; 01.07.2010
comment
@stratwine: чтобы уточнить, адаптер ресурсов — это развертываемый компонент JCA. - person Pascal Thivent; 01.07.2010

Транзакции в этом контексте относятся к транзакциям базы данных. Если вы размещаете код Java, который изменяет переменные или производит вывод в файловую систему, вы используете его неправильно. Вы должны начать транзакцию и выполнять операции только с базой данных.

Однако, если ваша СУБД вносит изменения в вашу файловую систему (например, через процедуру сохранения), вы должны проверить документацию этой СУБД.

Итак, прочитайте свой код, если у вас есть код после команды «НАЧАТЬ ТРАНЗАКЦИЮ», вы должны просмотреть его.

person santiagobasulto    schedule 01.07.2010
comment
Почему ты так говоришь, брат? Я не силен в английском, может я что-то не так написал. Редактировать: я прочитал ваш ответ, теперь я знаю, что вы имеете в виду. Спасибо! (Кстати, отличный ответ) +1 - person santiagobasulto; 01.07.2010