帮忙分析下这个游标

沉睡的老妖 2012-10-20 10:08:05
小弟对数据库知识水平甚缺,请教各位高手,这个游标会不会在多用户使用的时候,造成死锁,如果发生死锁,是怎么处理游标中的数据呢?


declare curn cursor for
select ActionId,ItemId,GroupID
,Medicare,MedicareRate,BeginTime
,[Name],[Type],Category
,Code,Usage,TotalDosage
,TotalDosageUnit,OneDosageUnit,Frequency
,PackQty,OneDosage,BaseQty
,Drugstore,AdviceItem,ChildrenRate
,CurDoctorId,CurDoctorName,Remark,AdviceId
from emrPrescribe
where PatientNo=@PatientNo
and ExecuteTime=@ExecuteTime
open curn
fetch next from curn into @Actionid,@ItemId,@GroupID
,@Medicare,@MedicareRate,@BeginTime
,@Name,@Type,@Category
,@Code,@Usage,@TotalDosage
,@TotalDosageUnit,@OneDosageUnit,@Frequency
,@PackQty,@OneDosage,@BaseQty
,@Drugstore,@AdviceItem,@ChildrenRate
,@CurDoctorId,@CurDoctorName,@Remark,@AdviceId
WHILE (@@fetch_status = 0)
begin
exec submitToLis --@Actionid
@lisid
,@Code
,@AdviceItem
,@BaseQty
,@AdviceCount
,@zd

exec submitDrugsToHis @PatientNo
,@Actionid
,@tmpGroupid
,@DeptName
,@Name
,@Code
,@Quantity
,@Unit
,@DrugstoreType
,@DCAType
end

fetch next from curn into @Actionid,@ItemId,@GroupID
,@Medicare,@MedicareRate,@BeginTime
,@Name,@Type,@Category
,@Code,@Usage,@TotalDosage
,@TotalDosageUnit,@OneDosageUnit,@Frequency
,@PackQty,@OneDosage,@BaseQty
,@Drugstore,@AdviceItem,@ChildrenRate
,@CurDoctorId,@CurDoctorName,@Remark,@AdviceId
end
close curn
deallocate curn
...全文
178 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
rt112000 2012-10-22
  • 打赏
  • 举报
回复
为什么有2个‘end'?
Andy-W 2012-10-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 3 楼 的回复:

执行先后顺序不一致也可能出现死锁,
索引太多或者没有索引导致锁升级也容易发生死锁,
事务太长也会出现死锁,
最好的方法先检查出哪一个位置发生死锁,再进一步分析

要是知道是哪一步发生的死锁就好了
[/Quote]

可以通過SQL Server Profiler跟蹤
Mr_Nice 2012-10-22
  • 打赏
  • 举报
回复
LZ是2K8以上的话,可以分步调试看看。 如果不涉及到修改数据的话,读锁是共享的。 当然阻塞也是比较烦人,LZ可以监控一下看看实际效果。

另外,除非一些特殊的情景,一般的操作,都可以用其他算法,来替代游标。毕竟游标的效率实在是堪忧。 LZ可以换个思路看看。 或许可更好解决。

参考
沉睡的老妖 2012-10-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

执行先后顺序不一致也可能出现死锁,
索引太多或者没有索引导致锁升级也容易发生死锁,
事务太长也会出现死锁,
最好的方法先检查出哪一个位置发生死锁,再进一步分析
[/Quote]
要是知道是哪一步发生的死锁就好了
沉睡的老妖 2012-10-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

如果不涉及对这个表的数据修改的话,应该没关系,读锁是可以共享的。如果涉及到数据的修改的话,这个要看你对数据一致性的要求了,如果要求不高,为了追求效率,可以再执行的时候不加锁,方法见1楼
[/Quote]
数据肯定要保持一致性的。。
  • 打赏
  • 举报
回复
如果不涉及对这个表的数据修改的话,应该没关系,读锁是可以共享的。如果涉及到数据的修改的话,这个要看你对数据一致性的要求了,如果要求不高,为了追求效率,可以再执行的时候不加锁,方法见1楼
Andy-W 2012-10-22
  • 打赏
  • 举报
回复
执行先后顺序不一致也可能出现死锁,
索引太多或者没有索引导致锁升级也容易发生死锁,
事务太长也会出现死锁,
最好的方法先检查出哪一个位置发生死锁,再进一步分析
中国风 2012-10-20
  • 打赏
  • 举报
回复
from emrPrescribe with (nolock)
where PatientNo=@PatientNo

查询时可用脏读或用快照隔离处理,看看调用处理的逻辑

22,294

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧