你用的是什么版本的数据库?mysql 低版本好像有这个问题,虽然你的 jdbc 支持事务处理,但是数据库不支持。

解决方案 »

  1.   

    呵呵不好意思忘了说了,数据库用的是Oracle 9i,应用服务器用的是weblogic8.1
      

  2.   

    那或许是 jdbc 的问题,或许是你代码的问题,可以的话贴出你那段代码,一般是这样的
    try {
    ......
    }
    catch (Exception e) {
         e.printStackTrace();
         try {
              con.rollback();
         }
         catch (Exception e1) {
              e1.printStackTrace();
     return e1.getMessage();
         }
         return e.getMessage();
    }
    finally {
         try {
              con.setAutoCommit(oldMethod);
         }
         catch (Exception e) {
              e.printStackTrace();
              return e.getMessage();
         }
    }
      

  3.   

    由于我是用Hibernate访问后台数据库,大致代码如下:
    try
    {
    //封装的Hibernate DAO
    HibernateImpl hi=new HibernateImpl();
    hi.update(...);
    }
    catch(Exception e)
    {
    logger.error("...");
    logger.error(e.getStackTrace());
    throw new MyException("...");
    }
      

  4.   

    在 DAO 上一层调用该方法里面是否有捕捉 exception,事务处理应该在 DAO 的上一层,不是在 DAO 层,这样才能保持 DAO 的简单性,重用性,清爽性^_^
      

  5.   

    那就在你的 dao 里写我给你的代码
    必须将你要执行的若干 sql 语句放在 con.setAutoCommit(false);........con.setAutoCommit(true);之间,并且要捕捉异常,一旦出现异常,必须rollback
      

  6.   

    你肯定把事务处理写到 hi.update()里面了那样每update一个数据就写入一次...无法rollback了把事务处理拿到hi外
      

  7.   

    //定义Hibernate封装的DAO
    HibernateImpl hi=new HibernateImpl();try
    {
      //更新数据1
      hi.update(...);
    }
    catch(Exception e)
    {
      logger.error("数据1更新失败!");
      logger.error(e.getStackTrace());
      throw new MyException("数据1更新失败!");
    }//这段代码发生异常
    try
    {
      //更新数据2
      hi.update(...);
    }
    catch(Exception e)
    {
      logger.error("数据2更新失败!");
      logger.error(e.getStackTrace());
      throw new MyException("数据2更新失败!");
    }
      

  8.   

    DAO里是有回滚逻辑的,但照你这个思路也只是单段回滚而不是整个事务的回滚啊,我代码目前是只有的(上面的回复忘写这段了^O^)
      

  9.   

    想不到CMP中还要自己写事务代码,长见识了
      

  10.   

    我不懂Hibernate,可能说得不多,单从事务的原理上来说,Jacky1206(胖胖)说的有道理,你不应该在hi.update(...)方法中进行事务处理,而应该在外面,比如这样:
    //事务开始
    for(...){
      hi.update(...);
    }
    //事务结束
    将所有的update()都放在一个事务中,而不是将一个update()放在一个事务中
      

  11.   

    问题解决了,其实只需要将所有的update代码放到一个try块中即可,谢谢大家捧场,稍后将分奉上^_^