如果B是新开启一个事务的话,执行B事务时候,A事务就会挂起,B的成败与否于A无关,B事务完成,A继续做下去.如果B失败时候让A的事务回滚,这还是一个事务的嵌套吗?

解决方案 »

  1.   

    如果A和B都是EJB的话
    我想是这样:
    看你EJB B的事务属性是什么,如果是加入EJB A的事务的话,那B发生rollback时A也rollback
    如果EJB B的事务定义为独立的话,那A就不会rollback
      

  2.   

    我想是不是要给B的ejb-jar.xml里面进行一下特殊的设置?我的目的就是想和 GFox(小狐) 说的一样:
    "B发生rollback时A也rollback",
    可是怎么设置呢?A也需要设置一下吧?又怎么设呢?谢谢!还有,如果不能像我想象得那么做,
    那么可不可以在调用B的时候,把A的事务处理的对象传到B里面。
    这样的话,如果B里的操作失败了,那么执行那个传进来的事务处理对象的rollback(),
    会不会也能达到预期的效果呢?再次感谢!
      

  3.   

    up一下!
    我急需答案呀!ThanX!!!
      

  4.   

    这是一个嵌套事务,可以通过设置ejb-jar文件中的事务属性的配置来进行管理。
    当B事务rollback的时候,A也被rollback。
      

  5.   

    在容器管理事务中A开始一个事务然后调用B中的method.它运行在A开始的事务中还是重新执行一个新的事务?结果要看B中的事务属性。
      

  6.   

    把A的事务属性设为Required应该可以满足你的要求,当容器管理事务中的ejb的事务属性设为
    Require时:如果客户端正在一个运行的事务中调用一个企业Bean的方法,这个方法就在这个客户端的事务中执行。如果客户端不关联一个事务,这个容器在运行该方法前开始一个新的事务。Required属性在许多事务环境中可以很好的工作,因此你可以把它作为一个默认值,至少可以在早期开发中使用。因为事务的属性是在部署描述符中声明的,在以后的任何时候修改它们都很容易。
      

  7.   

    我的B的事务是开始在A开始的事务之后的,
    也就是开始的顺序是:
    A的事务开始 -> B的事务开始 -> B的事务结束 -> A的事务结束
    如果是这样,有什么办法吗?
    (要的很急,我没时间找资料了,还请高人明示,在下不胜感激)
    如果不指定“事务属性”的话,“事务属性”是什么样的呢?
    还有,是不是我的A的“事务属性”必须要设置成什么才能实现我的目标?附:
    我的ejbbean A的ejb-jar.xml是这样的:
    <?xml version="1.0"?><!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN' 'http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd'><ejb-jar>
    <enterprise-beans>
    <session>
    <ejb-name>AEjbHome</ejb-name>
    <home>MyEJB.AEjbHome</home>
    <remote>MyEJB.AEjb</remote>
    <ejb-class>MyEJB.AEjbBean</ejb-class>
    <session-type>Stateless</session-type>
    <transaction-type>Bean</transaction-type>
    <env-entry>
    <env-entry-name>BEAS</env-entry-name>
    <env-entry-type>java.lang.Double </env-entry-type>
    <env-entry-value>100.0</env-entry-value>
    </env-entry>
    <env-entry>
    <env-entry-name>MSFT</env-entry-name>
    <env-entry-type>java.lang.Double </env-entry-type>
    <env-entry-value>150.0</env-entry-value>
    </env-entry>
    </session>
        </enterprise-beans>
    </ejb-jar>我的ejbbean B的ejb-jar.xml是这样的:<?xml version="1.0"?>
    <!-- DAGen template file Version 1.0 2002/09/18 -->
    <!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN' 'http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd'>
    <ejb-jar>
    <enterprise-beans>
    <session>
    <ejb-name>BEjbHome</ejb-name>
    <home>MyEJB.BEjbHome</home>
    <remote>MyEJB.BEjb</remote>
    <ejb-class>MyEJB.BEjbBean</ejb-class>
    <session-type>Stateless</session-type>
    <transaction-type>Bean</transaction-type>
    <env-entry>
    <env-entry-name>BEAS</env-entry-name>
    <env-entry-type>java.lang.Double </env-entry-type>
    <env-entry-value>100.0</env-entry-value>
    </env-entry>
    <env-entry>
    <env-entry-name>MSFT</env-entry-name>
    <env-entry-type>java.lang.Double </env-entry-type>
    <env-entry-value>150.0</env-entry-value>
    </env-entry>
    </session>
        </enterprise-beans>
    </ejb-jar>
      

  8.   

    我的ejbbean B的ejb-jar.xml是这样的:<?xml version="1.0"?>
    <!-- DAGen template file Version 1.0 2002/09/18 -->
    <!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN' 'http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd'>
    <ejb-jar>
    <enterprise-beans>
    <session>
    <ejb-name>BEjbHome</ejb-name>
    <home>MyEJB.BEjbHome</home>
    <remote>MyEJB.BEjb</remote>
    <ejb-class>MyEJB.BEjbBean</ejb-class>
    <session-type>Stateless</session-type>
    <transaction-type>Bean</transaction-type>//此处bean改为Container
    <env-entry>
    <env-entry-name>BEAS</env-entry-name>
    <env-entry-type>java.lang.Double </env-entry-type>
    <env-entry-value>100.0</env-entry-value>
    </env-entry>
    <env-entry>
    <env-entry-name>MSFT</env-entry-name>
    <env-entry-type>java.lang.Double </env-entry-type>
    <env-entry-value>150.0</env-entry-value>
    </env-entry>
    </session>
        </enterprise-beans>
    //加上这一段
      <assembly-descriptor>
        <container-transaction>
          <method>
            <ejb-name>statelessSession</ejb-name>
    <method-name>*</method-name>
          </method>
          <trans-attribute>Required</trans-attribute>
        </container-transaction>
      </assembly-descriptor>
    //加上这一段
    </ejb-jar>
      

  9.   

    把A,B的事务属性设为Required就可以了
      

  10.   

    如果我里面的处理不加入事务处理的话,
    出了错,能在外面的事务处理rollback()吗?是不是只要在外面的事务处理里加入相应的catch(),
    然后再在那个代码段里执行rollback()就可以了呢?
      

  11.   

    对了,还有,我那个内部的事务处理出错后,报出了一个下面的错
    *****************************( start )*****************************
    java.rmi.RemoteException: Error during postInvoke.; nested exception is: 
    java.lang.Exception: Stateless session beans with bean-managed transactions must commit or rollback their transactions before completing a business method.Start server side stack trace:
    java.rmi.RemoteException: Error during postInvoke.; nested exception is: 
    java.lang.Exception: Stateless session beans with bean-managed transactions must commit or rollback their transactions before completing a business method.
    java.lang.Exception: Stateless session beans with bean-managed transactions must commit or rollback their transactions before completing a business method.
    at weblogic.ejb20.manager.StatelessManager.postInvoke(StatelessManager.java:192)
    at weblogic.ejb20.internal.BaseEJBObject.postInvoke(BaseEJBObject.java:202)请问这是什么意思?
    有什么问题吗?