行锁是oracle自动实现的,不需要你的pb插手

解决方案 »

  1.   

    //function
    // lock selected rows of table
    // if the rows be not locked within 'l_limit' then display 
    // the messagebox and allow the user to select continue or exit//argument
    // ar_sql--the sql sentence of the table that is going to be locked
    //    ar_field -- then fields that user want to lock up//return value
    // 0--lock success
    // 1--lock failurelong l_limit=2 //lock time limit(second)
    long l_afterint int_i,int_message
    string st_sql
    time t_start
    long l_pos//delete '~"' in the ar_sql
    l_pos=pos(ar_sql,'~"', 1)
    do while l_pos>0
    ar_sql=replace(ar_sql,l_pos - 1,2,'')
    l_pos=pos(ar_sql,'~"', l_pos - 1)
    loopt_start=now()if not gf_empty(ar_cols) then
    st_sql=ar_sql+" for update OF " + ar_cols  +" NOWAIT "
    else
    st_sql=ar_sql+" for update NOWAIT "
    end if//messagebox('',st_sql)
    EXECUTE IMMEDIATE :st_sql;
    do while sqlca.sqlcode= - 1
    choose case sqlca.sqldbcode
    case 54 //table is being locked
    l_after=SecondsAfter(t_start,now())
    if (l_after>l_limit) or (l_after<0 and l_after+86400>l_limit) then
    int_message=messagebox('系统提示','您所申请的资源正在被他人占用,是否继续重试?',Question!,YesNo!,1)
    if int_message=2 then
    return 1
    else
    t_start=now()
    end if
    end if
    case else //other
    messagebox('提示','数据库错误描述:'+sqlca.sqlerrtext+"sqldbcode:"+string(sqlca.sqldbcode),StopSign!)
    return 1 // exit
    end choose
    EXECUTE IMMEDIATE :st_sql;
    loop
    return 0
      

  2.   

    我怎么判断是哪条记录己经被锁定,是不是有相关的记录锁的系统存储过程。
    例如: select name from employee where name = '张三';
    我如何去判断name='张三'的这条记录被锁定啦!
      

  3.   

    EXECUTE IMMEDIATE select name from employee where name = '张三' for update;之后判断sqlca.sqldbcode的值,如果是54的话改记录就是被锁定的你仔细看看这段代码,已经使用了8年了
      

  4.   

    to: maohaisheng() 
      使用过你的函数,岂不是将原来没有锁的数据给锁住了?
      

  5.   

    select name from empleyee where name='张三' for update;
    这样可以把这条记录加锁,别的用户不能对这条记录进行操作!
    只有发出roll或commit命令,这条记录才解锁!
      

  6.   

    to Lastdrop(空杯)  你说的有道理,将原来没有锁的数据给锁住了。查一条记录有没有被锁,我只知道这种方法。数据字典里面好像只能记录,那个表被锁了,加的是什么锁。to  lyzalan ()  在应用中,加锁是为了并发操作!其实“判断name='张三'的这条记录被锁定”没有什么意义,我觉得关键还是锁在谁的手里,谁才可以修改,修改前必须加锁(可以考虑各种锁),保存后解锁。
      

  7.   

    FOR UPDATE 之后再加上 NOWAIT !!
    这样当记录已经被别人加锁时不用(一直)等待别人解锁,立刻返回。
      

  8.   

    首先谢谢各位:我的具体需求是这样的:
        某条记录只能一个人修改,其它人可以读(也即可以进入相应的界面,但是不能修改!)
    并且这个读用用户不能长时间处于等待状态,具体怎么处理? 另外如果电脑突然断电的情况下,锁应会自动解锁吧! 
        另外我用了两个按钮:
    按钮1脚本:execute immediate "select data_id  from crm_tl_status where data_id='test' for update " using itr_tran ; 
    messagebox('1',string(itr_tran.sqldbcode)) //return 0
    if itr_tran.sqldbcode = 54 then
        messagebox('lock1','dfsdf')            //no execute
    end if按钮2脚本:execute immediate "select data_id  from crm_tl_status where data_id='test' for update " using itr_tran ; 
    messagebox('2',string(itr_tran.sqldbcode)) //return 0
    if itr_tran.sqldbcode = 54 then
        messagebox('lock2','dfsdf')            //no execute
    end if为何没有锁定呢?
      

  9.   

    不好意思,我刚才弄错啦,应该用不同的事务才可以。
    我做了测试:如果加上 no wait 后则 SQLDBCODE=933 ,如果不加是长时间的等待!