Когда следует использовать атрибуты транзакции EJB 'Обязательно' и 'Никогда' - PullRequest
3 голосов
/ 20 февраля 2009

Я имею в виду атрибуты управляемых контейнером транзакций в Enterprise Java Beans. Я не могу вспомнить ни одного случая использования, в котором использование «Обязательный» и «Никогда» имеет смысл. Может кто-нибудь объяснить, какие случаи оправдывают использование этих атрибутов транзакции?

Ответы [ 4 ]

6 голосов
/ 25 января 2011

Недавно я работал с проектом, который настаивал на том, чтобы все транзакции были размечены на прикладном уровне (классы обслуживания), и что объекты доступа к данным не должны вызываться напрямую.

Это было сделано для того, чтобы база данных никогда не была записана без вызова логики связанного приложения (обычно операция базы данных была связана с сообщением, отправленным в очередь).

Применение ОБЯЗАТЕЛЬНОГО на каждом EJB DAO гарантировало, что, пока они будут выполняться в транзакции, вызывающая сторона должна была запустить ее. Поскольку DAO вызывались классами обслуживания (которые по умолчанию имели значение REQUIRED), это означало, что они работали просто отлично, но любой, кто случайно вызовет их напрямую, будет вознагражден за исключением.

2 голосов
/ 20 февраля 2009

Вот мой удар по этому вопросу:

Обязательно : EJB может предоставлять некоторую внутреннюю функцию, которая предполагает / полагается на уже запущенную транзакцию вызывающей стороны, и, если она не по разным причинам, не может ее инициировать и поэтому выдает ошибку EJB. Таким образом, реальный вопрос здесь заключается в том, почему это когда-либо является требованием, и единственный сценарий, который я могу придумать, - это сценарий, в котором могут быть определенные действия, связанные с транзакцией, которые должны быть выполнены при запуске транзакции, а некоторые EJB-компоненты не оборудованы для этих действий и т.д. помечены как обязательные. Я полагаю, что вы также можете использовать этот атрибут для обеспечения согласованного и правильно упорядоченного захвата блокировки, когда невыполнение этого может привести к тупику.

Никогда : Это заставляет ваш EJB выдавать исключение, если транзакция выполняется при вызове EJB, и опять же, реальный вопрос в том, какой сценарий потребует этого. Ссылаясь на Мастеринг EJB, третье издание , Эд Роман утверждает, что этот атрибут полезен для уменьшения ошибок кодирования на стороне клиента, предотвращая неверное предположение, что EJB будет участвовать в процедуре ACID .

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

1 голос
/ 19 июля 2012

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

Обязательный бросков TransactionRequiredException , в то время как Никогда бросков RemoteException .

Например, если клиент запускает внутри / снаружи транзакцию и вызывает метод корпоративного компонента, который также будет запускать внутри / снаружи транзакции, тогда не будет выдано исключение для ОПОРЫ . Однако, если вы использовали ОБЯЗАТЕЛЬНО , для вне будет выдано исключение TransactionRequiredException.

1 голос
/ 11 июня 2009

У меня есть случай, когда атрибут обязательный является полезным:

У меня есть бин, который вызывается многими приложениями. в зависимости от вызывающего приложения, я хочу иметь возможность присоединиться к вызывающей транзакции или выполнить новую транзакцию. поэтому у меня определены 2 бина, один с RequNew и один с Required. Второй может использовать Обязательный, чтобы гарантировать, что есть вызывающая транзакция, но это не обязательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...