Атрибут | Описание |
---|---|
REQUIRED | Этот атрибут (задан по умолчанию) означает, что метод всегда должен вызываться внутри транзакции. Контейнер создает новую транзакцию, если метод вызывается из клиента, не использующего транзакции. Если клиент имеет контекст транзакций, бизнес-метод запускается внутри транзакции клиента. Вам следует указывать атрибут REQUIRED в том случае, когда вызываются методы, которые должны использовать транзакции, но при этом нельзя однозначно сказать, использует клиент транзакции или нет |
REQUIRES_NEW | Контейнер всегда создает новую транзакцию перед тем, как начать выполнять метод. Независимо от того, имеет ли клиент контекст транзакции, контейнер временно приостанавливает эту транзакцию, создает новую, фиксирует или откатывает ее, а затем возобновляет первую транзакцию. Это означает, что успех или провал второй транзакции не имеет никакого эффекта для существующей транзакции клиента. Вам следует указывать атрибут REQUIRES_NEW, если вы не хотите выполнять откат транзакции, который мог бы затронуть клиент |
SUPPORTS | Метод EJB наследует контекст транзакции клиента. Если контекст транзакции доступен, он используется этим методом, в противном случае контейнер вызывает метод без контекста транзакции. Вам следует указывать атрибут SUPPORTS, если у вас есть доступ к базе данных только для чтения |
MANDATORY | Контейнер требует наличия транзакции перед вызовом бизнес-метода, но не станет создавать новый контекст. Если клиент имеет контекст транзакции, он используется, в противном случае генерируется исключение javax.ejb.EJBTransactionRequiredException |
NOT_SUPPORTED | Метод EJB не может быть вызван при наличии контекста транзакции. Если клиент не имеет контекста транзакции, ничего не происходит, в противном случае контейнер приостанавливает транзакцию клиента, вызывает метод, а затем, как только метод отработает, возобновляет транзакцию |
NEVER | Метод EJB не должен вызываться из клиента, использующего транзакции. Если клиент имеет контекст транзакции, контейнер генерирует исключение javax.ejb.EJBException |
На рис. 9.6 проиллюстрированы все возможные варианты поведения, которые EJB может иметь в зависимости от наличия контекста транзакции у клиента. Например, если метод createBook() не имеет контекста транзакции (верхняя часть рисунка) и вызывает метод addItem(), имеющий атрибут MANDATORY, то генерируется исключение. В нижней части рис. 9.6 показаны те же комбинации, но для клиента, который имеет контекст транзакции.
Рис. 9.6. Два вызова InventoryEJB, осуществленные при различной политике транзакций