blob: af7a02ea8ff8b3f0ab09ae0909abe1207cb0f709 [file] [log] [blame]
Title: Transaction Annotations
_Also see [Testing Transactions](testing-transactions-example.html)
for an example of how to use and test EJB transaction attributes_
The *javax.ejb.TransactionAttribute* annotation (@TransactionAttribute) can
be applied to a bean class or it's methods.
Usage of the @TransactionAttribute requires you to specify one of six
different transaction attribute types defined via the
javax.ejb.TransactionAttributeType enum.
- TransactionAttributeType.*MANDATORY*
- TransactionAttributeType.*REQUIRED*
- TransactionAttributeType.*REQUIRES_NEW*
- TransactionAttributeType.*SUPPORTS*
- TransactionAttributeType.*NOT_SUPPORTED*
- TransactionAttributeType.*NEVER*
Per EJB 3.0 the default transaction attribute for all EJB 3.0 applications
is *REQUIRED*. The default transaction attribute for EJB 2.1, 2.0 and 1.1
applications is vendor specific. In OpenEJB EJB 2.1, 2.0 and 1.1
applications also use *REQUIRED* as the default.
<a name="TransactionAnnotations-AttributeTypessummary"></a>
## Attribute Types summary
A simplistic way to visualize the transaction attributes is as follows.
<table>
<tr><td> </th><th> Failing </th><th> Correcting </th><th> No Change </th></tr>
<tr><th> Transacted </td><td> MANDATORY </td><td> REQUIRED, REQUIRES_NEW </td><td> SUPPORTS </td></tr>
<tr><th> Not Transacted </td><td> NEVER </td><td> NOT_SUPPORTED </td><td> SUPPORTS </td></tr>
</table>
The "*Transacted*" and "*Not Transacted*" categories represent the
container guarantee, i.e. if the bean method will or will not be invoked in
a transaction. The "*Failing*", "*Correcting*", and "*No Change*"
categories represent the action take by the container to achieve that
guarantee.
For example, *Never* and *Mandatory* are categorized as "*Failing*" and
will cause the container to throw an exception to the caller if there is
(Tx Never) or is not (Tx Mandatory) a transaction in progress when the
method is called. The attributes *Required*, *RequiresNew*, and
*NotSupported* are categorized as "*Correcting*" as they will cause the
container to adjust the transactional state automatically as needed to
match the desired state, rather than blocking the invocation by throwing an
exception.
<a name="TransactionAnnotations-DetaileddescriptionofeachAttribute"></a>
### Detailed description of each Attribute
<a name="TransactionAnnotations-MANDATORY"></a>
#### MANDATORY
A _MANDATORY_ method is guaranteed to always be executed in a transaction.
However, it's the caller's job to take care of suppling the transaction.
If the caller attempts to invoke the method *outside* of a transaction,
then the container will block the call and throw them an *exception*.
<a name="TransactionAnnotations-REQUIRED"></a>
#### REQUIRED
A _REQUIRED_ method is guaranteed to always be executed in a transaction.
If the caller attempts to invoke the method *outside* of a transaction, the
container will *start* a transaction, execute the method, then *commit* the
transaction.
<a name="TransactionAnnotations-REQUIRES_NEW"></a>
#### REQUIRES_NEW
A _REQUIRES_NEW_ method is guaranteed to always be executed in a
transaction. If the caller attempts to invoke the method *inside or
outside* of a transaction, the container will still *start* a transaction,
execute the method, then *commit* the transaction. Any transaction the
caller may have in progress will be *suspended* before the method execution
then *resumed* afterward.
<a name="TransactionAnnotations-NEVER"></a>
#### NEVER
A _NEVER_ method is guaranteed to never be executed in a transaction.
However, it's the caller's job to ensure there is no transaction. If the
caller attempts to invoke the method *inside* of a transaction, then the
container will block the call and throw them an *exception*.
<a name="TransactionAnnotations-NOT_SUPPORTED"></a>
#### NOT_SUPPORTED
A _NOT_SUPPORTED_ method is guaranteed to never be executed in a
transaction. If the caller attempts to invoke the method *inside* of a
transaction, the container will *suspend* the caller's transaction, execute
the method, then *resume* the caller's transaction.
<a name="TransactionAnnotations-SUPPORTS"></a>
#### SUPPORTS
A _SUPPORTS_ method is guaranteed to adopt the exact transactional state of
the caller. These methods can be invoked by caller's *inside or outside*
of a transaction. The container will do nothing to change that state.
<a name="TransactionAnnotations-OnMethods"></a>
## On Methods
@Stateless
public static class MyBean implements MyBusinessInterface {
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public String codeRed(String s) {
return s;
}
public String codeBlue(String s) {
return s;
}
}
- _codeRed_ will be invoked with the attribute of _MANDATORY_
- _codeBlue_ will be invoked with the default attribute of _REQUIRED_
<a name="TransactionAnnotations-OnClasses"></a>
## On Classes
@Stateless
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public static class MyBean implements MyBusinessInterface {
public String codeRed(String s) {
return s;
}
public String codeBlue(String s) {
return s;
}
}
- _codeRed_ and _codeBlue_ will be invoked with the attribute of
_MANDATORY_
<a name="TransactionAnnotations-Mixedonclassesandmethods"></a>
## Mixed on classes and methods
@Stateless
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public static class MyBean implements MyBusinessInterface {
@TransactionAttribute(TransactionAttributeType.NEVER)
public String codeRed(String s) {
return s;
}
public String codeBlue(String s) {
return s;
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public String codeGreen(String s) {
return s;
}
}
- _codeRed_ will be invoked with the attribute of _NEVER_
- _codeBlue_ will be invoked with the attribute of _SUPPORTS_
- _codeGreen_ will be invoked with the attribute of _REQUIRED_
<a name="TransactionAnnotations-IllegalUsage"></a>
# Illegal Usage
Generally, transaction annotationss cannot be made on AroundInvoke methods
and most callbacks.
The following usages of @TransactionAttribute have no effect.
@Stateful
public class MyStatefulBean implements MyBusinessInterface {
@PostConstruct
@TransactionAttribute(TransactionAttributeType.NEVER)
public void constructed(){
}
@PreDestroy
@TransactionAttribute(TransactionAttributeType.NEVER)
public void destroy(){
}
@AroundInvoke
@TransactionAttribute(TransactionAttributeType.NEVER)
public Object invoke(InvocationContext invocationContext) throws Exception {
return invocationContext.proceed();
}
@PostActivate
@TransactionAttribute(TransactionAttributeType.NEVER)
public void activated(){
}
@PrePassivate
@TransactionAttribute(TransactionAttributeType.NEVER)
public void passivate(){
}
}