将long startTime,endTime和S()加上Synchronized,
将事务管理方式改为BEAN管理方式,然后在两个方法之间设定事务,再试试,看能不能解决问题。

解决方案 »

  1.   

    没有看明白楼主的问题所在
    1)在出现这种情况下,事务会发生突然的终止。知道为什么吗?就是因为“开始时间>结束时间”?
       不懂为什么事务的执行根系统时间没有关系?楼主的代码里面做了类似的判断?
    2)楼主得到的时间准确吗?
       同步吗?线程之间有没有同步,不同的jvm之间有没有同步?
      

  2.   

    我增加开始时间 和 结束时间 只是为了调试问题所在,但是我认为是因为执行时间过长,造成事务已结束的这个问题。后来调试过程中才发现这一奇怪的问题。也就是,但凡发生事务被终止,必定是
    开始时间 〉结束时间。 以此,我认为是由于另外的进程在A()没有调用完成之前获取了这一sessionBean的句柄,并调用A(),而sessionContext是一个全局性的东西,我估计是这样才造成了事务的混乱。我不知道我的理解是否正确,希望能得到一个解释,同时也希望各位能给出一个解决方法。我客户端的调用是:
    ctx = getUserTransaction();
    try {
    ctx.begin()
     //todo: something
     call A();
    ctx.commit()
    }catch(e) {
     ctx.rollback();
    }
      

  3.   

    quote:
    我认为是由于另外的进程在A()没有调用完成之前获取了这一sessionBean的句柄,并调用A(),而sessionContext是一个全局性的东西,我估计是这样才造成了事务的混乱。
    =====================================================================================既然楼主有个估计,偶还是建议先搞清楚是否是这个问题。加一些log,判断是否为同一个线程。
    至于是否为同一个进程,除非有多个jvm,也就是多个jre在运行,通常只有一个进程的。
    A(){
      startTime = System.currentTimeMillis();
    System.out.println("开始时间:"+startTime+ " thread name:"+ Thread.currentThread().getName());
      //todo: something
      //invoke : S();
    }
    S() {
      //todo : something
      endTime = System.currentTimeMillis();
      System.out.println"结束时间:"+endTime + " thread name:"+ Thread.currentThread().getName());
    }如果发现是由于线程同步的问题,那就简单了,只要保证每个transaction中的操作时synchronized的就可以了。
    祝好运!
      

  4.   

    首先:除了ejb自身管理外,没有在client端开任何现成来进行调用
    第二:这个ejb处于ibm websphere容器管理中,没有加入任何其他额外的管理代码。
    第三:S()和A()处于同一个对象中,S只是一个私有方法而已。