使用EJB的时候遇到一个问题,因为系统比较老 用得的都是xml配置的 
有两张表:A,B
是原本的想法是A中的a字段update后,B表中的b字段根据A中更新a字段的数据做update
但是执行此方法 2个update好像是同时发出,所以B中的字段没有upadte 只有A的会变化
 
代码大致如下:
public class Impl{
 void update(xx){
  DetailDao.updateA(xx);
  DetailDao.updateB(xx);
 }
}public class DetailDao {
  static void updateA(xx){
     CommonDao.update(xx);
  }
  static void updateB(xx){
     CommonDao.update(xx);
  }
}public class CommonDao{
  //实际的sql
  .....
}ejb-jar.xml配置如下
 <session>
      <display-name>Impl</display-name>
      <ejb-name>Impl</ejb-name>
      <home>com.xx.ImplHome</home>
      <remote>com.xx.ImplRemote</remote>
      <ejb-class>com.xx.Impl</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
  </session>
请大家帮帮忙
谢谢~

解决方案 »

  1.   

    貌似不是commit不commit的问题吧,是不是你DetailDao.updateB里面的逻辑判断导致数据库本身就没有被更新。不惯怎么着,容器管理的事务应该是没问题的。看看你里面的逻辑判断 是不是不满足更新的条件。
      

  2.   

    谢谢你的回复,第一次updateA是有成功,而第二次updateB失败
    所以我把log里面的sql贴出来跑的话,
    如果不执行完一条commit一次  也会出现我所述的情况,
    但执行第一条,commit,再执行第二条 就正常了,
    因此我才会往CMT的commit的方向猜,
    其实修改一下可以解决 因为原来的逻辑分析一下本来就欠妥···
    同一个method里面 不应该让另一个update的结果依赖于上面的update的结果
    我只是比较好奇这个问题,希望能搞明白~
      

  3.   

    可能是你的DAO中采用了连接池,在这里DAO两个方法使用了两个不同的连接。
    而在oracle中,如果第一个会话(体现在这里就是第一个连接)不commit的话,其他会话(在这里就是第二个连接)是看不到它的更新的。
    其他数据库是什么样子的我不知道。所以,如果你要实现这样的事务,就得保证你的DAO里面,两个方法使用的是同一个连接会话(中间不能有connection.close把连接放回连接池)。我看你这里是两个dao中的方法,所以才如此猜想
      

  4.   

    谢谢回复
    好像你理解有些偏差···我本意是想让它成为2个事务,这样第一次做的update  才能为第二次做的可见
    我想的是 我的配置有问题  只让Impl里面的method让容器管理
    而Dao里面的并没有 但实际上做update是由Dao里面的method来控制 
    第一次update,此时还未提交 第二次update的时候看到的是脏数据
    致使数据不一致 
    个人猜想···还望指正