我用的是linux oci编程,调用commit()时有时提交不成功事务,弄得没有保存到磁盘数据文件,造成数据丢失。请问如何保证成功提交事务到数据文件里。谢谢!!

解决方案 »

  1.   

    你的COMMIT是提交到数据库里?还是写到数据文件里?
    你用的COMMIT是OCI自带的COMMIT方法么?那应该是提交到数据库里的。
    不能完全保证事务成功提交到数据库里,只能在每次COMMIT时,进行判断。
    如果提交没有成功,记错误日志。
      

  2.   

    当然指的是写到数据文件里啦。
    我用的是OCI自带的COMMIT方法,请问如何判断每次commit返回参数,请列出具体代码看看,谢谢!
      

  3.   

    咱俩用的不一样。不过,你有没有什么使用手册之类的,可以查一下。
    我用的是提交数据库的OCITransCommit方法,不是直接的commit
    对于OCITransCommit方法,返回值有如下:
    OCI_SUCCESS,OCI_SUCCESS_WITH_INFO,OCI_NEED_DATA,OCI_NO_DATA之类的;你可以查查你的commit方法有哪些返回参数。
      

  4.   

    Stmt = Conn->createStatement();
    Stmt->setSQL(strsql);
    count=Stmt->executeUpdate();
    Conn->commit();
    Conn->terminateStatement(Stmt);请问OCITransCommit()可以替换为commit()吗?
      

  5.   

    能不能替换我也不知道啊。没看到你所有的源程序。
    另外,你这里的commit不是OCI自己的方法,你不是通过一个类对象Conn来调用的嘛?
    你的commit是类Conn里封装的一个方法。
    你得深入到类Conn里仔细看了。
    我估计哈,这个类Conn->commit()方法里,实际上调用的还是OCITransCommit()
    呵呵,你自己找找吧。
      

  6.   

    Environment *Env;
    Connection *Conn;
    Statement *Stmt;
    Env = Environment::createEnvironment(Environment::OBJECT);
    Conn = Env->createConnection(user, pwd, strconn_string);
    Stmt = Conn->createStatement();
    Stmt->setSQL(strsql);
    count=Stmt->executeUpdate();
    Conn->commit();
    Conn->terminateStatement(Stmt);
    以上就是源程序的主要代码,就这么简单
      

  7.   

    亲爱的,我还是认为你的Connection也是自己封装的类。你看我这边的代码:
    在头文件里定义:
    class connection 
    {
    private:
       ...
    public:
       sword commit();
       ...
    }
    在cpp文件里定义:
    sword connection::commit()
    {
    if(_state != connected) return OCI_ERROR;
    return checkerr(OCITransCommit(_svchp, _errhp, (ub4) 0));
    }