写一个存储过程,里面用到了游标,也就是CRUSOR,然后在一个ERP系统里面查询,
把得到的数据经过处理之后再插入到别的表里面(和提取的ERP系统没有关系)
这个存储过程很大,经常运行运行就报错,说死锁,然后这个存储过程就无端的牺牲掉了
并且在此事ERP系统也变的非常的缓慢,综上所述我想问的问题如下:1, 存储过程里面我没有加入任何事物,难道不加事物的话,本身存储过程就是一个事物吗?
2,我生成的游标就是sql server默认的游标,我想问一下,游标在查询一个表的时候会对这个表加锁吗?
   游标本身不是事物吧?
3,究竟是什么原因导致我使用游标的时候会出现死锁呢,各位如果有经验分享一下也可。非常感谢!

解决方案 »

  1.   

    1, 存储过程里面我没有加入任何事物,难道不加事物的话,本身存储过程就是一个事物吗?
    --加上事务吧,万一出错了就无法回滚~~~~本身不是事务。
    2,我生成的游标就是sql server默认的游标,我想问一下,游标在查询一个表的时候会对这个表加锁吗?
      游标本身不是事物吧?3,究竟是什么原因导致我使用游标的时候会出现死锁呢,各位如果有经验分享一下也可。
    --要想不死锁必须提高你的SQL执行速度,你的响应速度越慢,则锁的越久,资源共享在时间越长,则死锁的机会越大。
    --所以不建立你用游标,改为批量执行。
    非常感谢!
      

  2.   

    1, 存储过程里面我没有加入任何事物,难道不加事物的话,本身存储过程就是一个事物吗?
    --储过程本身好像不是事物
    2,我生成的游标就是sql server默认的游标,我想问一下,游标在查询一个表的时候会对这个表加锁吗?
      游标本身不是事物吧? --游标不会对表加锁,游标也不是事物,游标好像就是一个结果集,
      --可以看可供访问做临时表,自然也就不是事物了
    3,究竟是什么原因导致我使用游标的时候会出现死锁呢,各位如果有经验分享一下也可。
    --游标的死锁;我估计是你游标运算太久,而造成的资源一直占用,导致死锁,我以前在计算物料需求计划时,
    --也曾计算了大量的物料,数据库有7G多,没有出现你说的现象,
    --于你说的运行你的sp 时,erp访问慢,这个正常,应为你的sp 占用了资源太多。优化sp,看看那里耗时
      

  3.   

    是啊,这个问题我无论是baidu还是google都没有找到确定的说法
    没有办法,只能自己研究了。