开发环境:Solaris 10
数据库:Oracle 10g  用PL/SQL管理
开发工具:CC 编译器        OCCI接口部分代码如下:
COracleWrapper *obj = new COracleWrapper(user, passwd, db);string sqlStr = "select * from tableOne where IsActive=1";
string updateStr = "update tableOne set querynow=1 where taskid=5";
while(true)
{
    
ResultSet* querySet = obj->ExecuteQuery(sqlStr);
    while(querySet->next())
    {
       int stateValue = querySet->getInt(4);
       if(stateValue == 1)
       {
 obj->ExecuteUpdate(updateStr);
       }
     }
     sleep(10000);
     obj->ClearQuery(querySet);
     sleep(10000);
}
delete (obj);问题:当我用while循环查询某一表某一记录时,这个记录某一字段就不能更新了吗?用PL/SQL更新改记录时,提示记录被另一用户锁住。有什么办法循环查询某一记录时,又能修改改记录某一字段。

解决方案 »

  1.   

    顶,这应该是Oracle锁机制的问题,没仔细研究过
      

  2.   

    stateValue 和querynow是表tableOne 的两个字段,初始值为0
    我是想通过while循环不断查询stateValue 字段的值, 当stateValue 值为1时,执行Update,更新querynow值为1。
    当我执行该程序后,用PL/SQL修改stateValue 为1,但是querynow为什么没有变化????
      

  3.   

    读不会对写产生影响。当一个会话对表数据进行修改,且尚未提交更改时,其他会话读取该表数据取自undo,读取到的是更改前的信息
    你这里是有一个会话对表内若干条数据执行了update操作,而没有提交,该会话占据了这几条记录上的排他锁。导致其他会话尝试dml操作时需要等待
    注意及时commit来避免
      

  4.   

    当我用while循环查询某一表某一记录时,这个记录某一字段就不能更新了吗
    可以呀。而且oracle实现了一致性读
    用PL/SQL更新改记录时,提示记录被另一用户锁住。
    这里会不会是你查询了以后,update的语句没有提交导致的。这里提示“提示记录被另一用户锁住”感觉也怪异,应该是停住,知道上个锁释放才是的。