Public interface javax.ejb.EJBContext { public Identity getCallerIdentity(); public boolean isCallerInRole(Identity other); public EJBHome getEJBHome(); public PRoperties getEnvironment(); public UserTransaction getUserTransaction() throwsIllegalStateException; public boolean getRollbackOnly(); public void set RollbackOnly(); }
一旦bean获得了一个UserTransaction的引用,就可以用这个引用治理自己的事务。 有状态的会话bean的方法可以创建一个事务,而且不用终止事务就可以返回。假如还有线程调用bean的方法,容器检测是否有bean创建的活动的事务,假如被调用的事务是同一个事务,容器会答应该线程重新进入这个bean.假如bean在事务中且执行不同事务上下文的线程试图进入bean,容器会阻塞这个线程直到bean的事务终止。假如线程试图进入事务时bean不在事务中,线程会执行一个自己的事务,容器会挂起线程当前的事务以答应线程进入。一旦线程离开方法就会恢复线程以前的事务,容器不会终止任何方法创建的事务。 对于无状态会话bean和实体bean,当事务活动时bean的方法不答应返回。容器会为此抛出一个例外。 Leaving a tranaction active across method calls is stateful,and is not allowed for stateless session beans.Fro similar reasons,entity beans are also not allowed to maintain an open transaction state across method calls when the bean has declared the TX_BEAN_MANAGED transaction control.
会话同步接口 有状态和无状态的会话bean都可以访问数据库,并且参与一个事务。为了让bean在事务中执行它的任务,bean开发者可以实现在bean中实现javax.ejb.SessionSynchronization接口。容器能自动检测这个接口,容器会使用这个接口中的方法以使bean得到事务的状态信息。实体bean不支持这个接口。因为实体bean are implicitly transaction aware,所以容器使用不同的方法控制一个事务中的实体bean.
SessionSynchronization接口定义如下: public interface javax.ejb.SessionSynchronization { public void afterBegin() throws RemoteException; public void beforeCompletion() throws RemoteException; public void afterCompletion(boolean yn) throws RemoteException; }
Current current = new Current(); Current.setServiceProvider(txMgrURL); Current.create(); Current.begin(); Current.doSomeWork(); RemRef1.doSomeWork(); RemRef2.doMoreWork(); Current.commit();