全面分析EJB编程式事务管理(bmt)和声明式事务管理(cmt)(二)――声明式事务

六、ejb声明式事务管理(CMT,容器管理事务)

ejb容器为其中的所有的ejb组件提供了一种默认的事务模式:Requires

在该模式下面,组件中的方法如果在事务环境下被调用(即客户端调用了该组件的方法),则方法中的逻辑会被添加到客户端的事务环境中,和客户端的程序使用相同的事务控制对象.如果不在事务环境中调用(在客户端没有调用该组件中的方法),ejb容器就创建新的事务对象,管理该方法中的所有逻辑.

例如:

ejb组件:

  @Statefull

public classpersonmanager inplements IPersonAdmin{

@PersistenceContext(unitName="mydb")

privateEntityManager manager;

@EJB(mappedName="MySession/remote")

privateIPersonAdmin mytools;

publicList<person> QueryAll(){

....

}

public voidcreatePerson(Person p){

Person pobj=newPerson();

pobj.setName("ziaoxioa");

#1manager.persist(pobj);

#2mytools.createPerson(p);

#3manager.persist(null);

}

客户代码:

...

myinf.createPerson(p);

...

默认情况下,ejb容器会为ejb组件中的所有方法配置一中requires型的事务服务.在这种事务模式下面,如果方法被在事务环境下调用,方法就使用客户端事务对象和事务环境ruguo不在事务环境中被调用,则ejb容器就会创建新的事务对象和环境来负责管理该方法的逻辑完整性!由于上面的#3错误,所以数据库中不会添加任何记录!

ejb容器为ejb组件添加的默认的事务策略能够满足多数情况下的算法要求,特殊情况下,可以通过@TransactionAttribute和<container-transaction>标记修改组件的默认事务策略!如下:

<ejb-jar

      xmlns="http://java.sun.com/xml/ns/javaee"

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

                          http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"

       version="3.0">

<assembly-descriptor>

   <container-transaction>

      <method>

       <ejb-name>MySession</ejb-name>

       <method-name>createPerson</method-name>

      </method>

     <trans-attribute>RequiresNew</trans-attribute>

   </container-transaction>

</assembly-descriptor>

</ejb-jar>

@TransactionAttribute(REQUIRES_NEW)

public voidcreatePerson(Person p){

manager.persist(p);

}

这样MySession中的createPerson方法事务修改成了RequiesNew模式,在这种模式下,ejb容器不论客户端是否具有事务特征,为createPerson创建一个新的事务对象,此时两个createPerson在完全不同的事务对象控制下。

你可能感兴趣的:(管理,声明)