哈哈哈!!!!
问题解决了。原来是这两个方法的事务引起的问题。
1、(ejb-jar.xml)原来这两个方法的事务是<trans-attribute>RequiresNew</trans-attribute>的。
2、现在我把B方法的事务改成了<trans-attribute>NotSupported</trans-attribute>的。
3、因为在B方法里没有使用事务的必要,因为它与数据库无联系。
4、这样以来,方法B的事务就不会影响方法A了。
===========================================
在session bean中事务有下列几种:
a)NotSupported
b)Supports
c)Required
d)RequiresNew
e)Mandatory
f)Never
现在问题已经解决了,请大家讨论一下这几个事务具体的范围是什么?就当散分了,讨论者有分!!谢谢,相互学习。

解决方案 »

  1.   

    你的问题虽然解决了,但是你的理解不太正确。
    应该是由于事务嵌套引起的,B的事务是外层事务,A的是内层事务,发生异常时,整个B事务都发生了回滚。
      

  2.   

    楼上的说的很对,是嵌套事务。
    但是<trans-attribute>RequiresNew</trans-attribute>为什么为使两个独立的public方法产生嵌套事务呢?
      

  3.   

    呵呵,在网上找到一部分,先来分享一下:
        Required 事务类型指明会话 bean 方法在代码执行时需要存在一个事务。如果不存在,则容器提供一个事务。如果在调用线程中已经存在一个事务,则使用该事务。
        RequiresNew 事务类型不同。如果在调用线程中不存在事务,则由容器创建一个事务,与 Required 事务类型相似。然而,如果调用线程已经存在一个事务,则将此事务挂起,并创建和使用一个新事务。然后再恢复并继续运行调用事务。
      

  4.   

    1、Required:当客户端运行一个事务处理并调用EJB的一个方法,这个方法执行客户端的事务处理;当客户端没有启动一个事务处理,则EJB容器在执行这个方法之前启动一个新的事务处理. 2、RequiresNew:当客户端运行一个事务处理并调用EJB的一个方法时,容器管理器做如下操作: 
    (1) 悬挂客户端的事务处理; 
    (2) 开始一个新的事务处理; 
    (3) 调用方法; 
    (4) 当方法结束,恢复客户端的事物处理. 
    当客户端没有启动一个事务处理,容器管理器在执行这个方法之前启动一个新的事务处理. 
    3、Mandatory: 当客户端运行一个事务处理并调用EJB的一个方法,这个方法在客户端的事务处理范围内被执行; 当客户端没有启动一个事务处理,容器管理器将会抛错(TransactionRequiredException); 
    4、NotSupported: 当客户端运行一个事务处理并调用EJB的一个方法,容器管理器在调用方法之前终止客户端的事务处理,当方法执行完,再恢复客户端的事务处理; 当客户端没有启动一个事务处理,容器管理器在调用方法时不启动事务处理. 
    5、Supports: 当客户端运行一个事务处理并调用EJB的一个方法,在运行方法时执行客户端的事务处理; 当客户端没有启动一个事务处理,容器管理器在调用方法时不启动事务处理. 
    6、Never: 当客户端运行一个事务处理并调用EJB的一个方法,容器管理器将抛出一个错误(RemoteException); 当客户端没有启动一个事务处理,容器管理器在调用方法时不启动事务处理.