开发人员可以选择使用EJB代码的编程事务分界(Bean管理),还是使用声明性分界(容器管理) .不管 Enterprise Bean 是使用 Bean 管理还是容器管理事务分界,都是由 EJB 容器和 Sun Java System 应用服务器实施事务管理。容器和服务器实施必需的低级事务协议,如事务管理器和系统或 Sun Java System 消息队列提供者之间的二阶段提交协议、事务上下文传播、分布式二阶段提交等。
容器管理事务
Enterprise Bean 的一个主要优点是支持容器管理事务,也称为声名性事务。在具有容器管理事务的 Enterprise Bean 中,EJB 容器设置事务的边界。
注意 | 您可以将容器管理事务与任何 Enterprise Bean 类型(会话、实体或消息驱动型)一起使用,但实体 Bean 只能使用容器管理事务。 |
容器管理事务简化开发,因为 EJB 代码不明确标记事务的边界。即,代码不包括开始和结束事务的语句。容器负责:
Bean 管理事务
EJB 规范使用 javax.transaction.UserTransaction 支持 Bean 管理事务分界。对于 Bean 管理事务,您必须执行 Java 命名和目录界面 (JNDI) 查找来获取 UserTransaction 对象。
Context initialContext = null;
UserTransaction utx = null;
try...{
initialContext = new InitialContext();
//J2EE standard path is: "java:comp/UserTransaction"
//but in jboss is: "UserTransaction"
utx = (javax.transaction.UserTransaction) initialContext.lookup("UserTransaction");
if(utx!=null)
System.out.println("======UserTransaction======="+utx.getStatus()+"--"+utx.toString());
return utx;
}catch(Exception exp)...{
exp.printStackTrace();
}
return null;
}
注意 | 您可以将 Bean 管理事务用于会话或消息驱动型 Bean,但实体 Bean 必须使用容器管理事务。 需要远程事务管理,要定义Stateful bean |
Bean 管理事务有两种类型: