游标引起的阻塞问题
zxszx 2009-09-05 08:02:05 将查询发送到服务器后,所有应用程序必须立即完成提取所有结果行。如果应用程序没有提取所有结果行,锁可能会留在表上而阻塞其他用户。如果使用的应用程序将Transact-SQL 语句透明地提交给服务器,则该应用程序必须提取所有结果行。如果应用程序没这样做(如果无法配置它执行此操作),则可能无法解决阻塞问题。为避免此问题,可以将这些应用程序限制在报表或决策支持数据库上。
我们来看一下因游标使用不当而引起的阻塞的例了
li_dqks = long(mid(ddlb_1.text,pos(ddlb_1.text,'-') + 1))
DECLARE my_cur CURSOR FOR
SELECT zy_brxx.zyhm
FROM zy_brxx where dqks = :li_dqks and dqzt is null;
open my_cur;
fetch my_cur into :ls_zyhm ;
do while sqlca.sqlcode = 0
uf_mrqd(ls_zyhm)
if dw_1.rowcount() <= 0 then
fetch my_cur into :ls_zyhm ;
continue
end if
dw_1.print()
fetch my_cur into :ls_zyhm ;
loop
close my_cur ;
以下是uf_mrqd 函数内容
datetime ldt_date01, ldt_date02
int li_hs,li_count,li_dqks,li_dmlb
string ls_pmlb,ls_brxm,ls_dqks,ls_dqch
dec{4}de_fsfy,de_yjk
select brxm,dqks,dqch into :ls_brxm,:li_dqks,:ls_dqch from zy_brxx where zyhm=:ls_zyhm;
select ksmc into :ls_dqks from gy_ksdm where ksdm = :li_dqks ;
ldt_date01=datetime(date(em_1.text),time('00:00:00'))
ldt_date02=datetime(date(em_2.text),time('23:59:59'))
dw_1.object.sj.text=string(ldt_date01,'yyyy.mm.dd hh:mm:ss')+'-'+string(ldt_date02,'yyyy.mm.dd hh:mm:ss')
dw_1.object.zyhm.text=ls_zyhm
dw_1.object.brxm.text=ls_brxm
dw_1.object.brks.text=ls_dqks
dw_1.object.ch.text=ls_dqch
dw_1.retrieve(ldt_date01,ldt_date02,ls_zyhm)
de_fsfy = gf_getbrfy(ls_zyhm)
de_yjk = gf_getyjk(ls_zyhm,1)
dw_1.object.bz.text="注: 病人截止目前总费用: "+string(de_fsfy,'0.00')
if de_fsfy < de_yjk then
dw_1.object.bz_02.text="病人预交款: "+string(de_yjk,'0.00')+" 尚余:"+string(de_yjk - de_fsfy,'0.00')
else
dw_1.object.bz_02.text="病人预交款: "+string(de_yjk,'0.00')+" 欠费:"+string(de_fsfy - de_yjk,'0.00')
end if
///////
显然这个游标有问题,最主要的问题是dw_1.print()不应该放入这个游标内,打印完了这个游标才结束,否则zy_brxx这个表一直被阻塞.
我们可以这样改一下
li_dqks = long(mid(ddlb_1.text,pos(ddlb_1.text,'-') + 1))
ll_row=dw_2.retrieve(li_dqks)
for i=1 to ll_row
ls_zyhm=dw_2.object.zyhm[i]
uf_mrqd(ls_zyhm)
dw_1.print()
next
这样就不会引起阻塞了