//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
我怎么判断是哪条记录己经被锁定,是不是有相关的记录锁的系统存储过程。 例如: select name from employee where name = '张三'; 我如何去判断name='张三'的这条记录被锁定啦!
EXECUTE IMMEDIATE select name from employee where name = '张三' for update;之后判断sqlca.sqldbcode的值,如果是54的话改记录就是被锁定的你仔细看看这段代码,已经使用了8年了
to: maohaisheng() 使用过你的函数,岂不是将原来没有锁的数据给锁住了?
select name from empleyee where name='张三' for update; 这样可以把这条记录加锁,别的用户不能对这条记录进行操作! 只有发出roll或commit命令,这条记录才解锁!
to Lastdrop(空杯) 你说的有道理,将原来没有锁的数据给锁住了。查一条记录有没有被锁,我只知道这种方法。数据字典里面好像只能记录,那个表被锁了,加的是什么锁。to lyzalan () 在应用中,加锁是为了并发操作!其实“判断name='张三'的这条记录被锁定”没有什么意义,我觉得关键还是锁在谁的手里,谁才可以修改,修改前必须加锁(可以考虑各种锁),保存后解锁。
FOR UPDATE 之后再加上 NOWAIT !! 这样当记录已经被别人加锁时不用(一直)等待别人解锁,立刻返回。
首先谢谢各位:我的具体需求是这样的: 某条记录只能一个人修改,其它人可以读(也即可以进入相应的界面,但是不能修改!) 并且这个读用用户不能长时间处于等待状态,具体怎么处理? 另外如果电脑突然断电的情况下,锁应会自动解锁吧! 另外我用了两个按钮: 按钮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为何没有锁定呢?
不好意思,我刚才弄错啦,应该用不同的事务才可以。 我做了测试:如果加上 no wait 后则 SQLDBCODE=933 ,如果不加是长时间的等待!
// 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
例如: select name from employee where name = '张三';
我如何去判断name='张三'的这条记录被锁定啦!
使用过你的函数,岂不是将原来没有锁的数据给锁住了?
这样可以把这条记录加锁,别的用户不能对这条记录进行操作!
只有发出roll或commit命令,这条记录才解锁!
这样当记录已经被别人加锁时不用(一直)等待别人解锁,立刻返回。
某条记录只能一个人修改,其它人可以读(也即可以进入相应的界面,但是不能修改!)
并且这个读用用户不能长时间处于等待状态,具体怎么处理? 另外如果电脑突然断电的情况下,锁应会自动解锁吧!
另外我用了两个按钮:
按钮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为何没有锁定呢?
我做了测试:如果加上 no wait 后则 SQLDBCODE=933 ,如果不加是长时间的等待!