具体数据库是这样设计的:
订单表:订单号,字段1,字段1,字段1,字段1,字段1,字段1,字段1,......定位
       订单号为主键!
流程表:
       流程定义ID,流程名
时间表:
       订单号,流程定义ID,计划时间,完成时间
    
所有的用户更新定位字段时都是通过调用一个存储过程来进行的!
这个存储过程中有事务!
BEGIN TRANSACTION
   update 订单表 set 定位='用户位置' where key='@订单号‘
   --检查其它数据,并且做一些插入和更新记录表的
   if 记录在时间表中存在
       update 时间表 set 计划时间=@date1,完成时间=null where 订单号=@订单号 ,流程定义   id=@流程定义ID
   else
      插入到时间表一条记录COMMIT TRANSACTION
现在我分析可能是多用户同时更新数据时,造成了锁定从而引起了阴塞!
各位帮我分析分析吧!
    

解决方案 »

  1.   

    zjcxc(邹建),我菜的很!
    1、你的存储过程使用的是自动锁,不是行锁或者页锁啊
        请问一下,存储过程中怎么使用行锁?
    2、
    存储过程中
    --检查其它数据,并且做一些插入和更新记录表的如果这个处理量较大的话,尽量不要在同一个事务中处理
    是改成嵌套的事务吗?
    非常感谢zjcxc(邹建),你真是一个好版主!
    帮帮我吧,不然我要去跳楼啦!
      

  2.   

    我是用这个来关闭页锁的:
    exec sp_indexoption '订单表','allowpagelocks','false'
    exec sp_indexoption '时间表','allowpagelocks','false'如果在存储过程中用行锁是加 with ROWLOCK吗?
    怎么加呢?
      

  3.   

    你可以这样测试你的行级锁是否生效:
    在存储过程中加入 waitfor delay延时BEGIN TRANSACTION
       update 订单表 set 定位='用户位置' where key='@订单号‘
       --检查其它数据,并且做一些插入和更新记录表的
       if 记录在时间表中存在
           update 时间表 set 计划时间=@date1,完成时间=null where 订单号=@订单号 ,流程定义   id=@流程定义ID
       else
          插入到时间表一条记录
      
      waitfor delay '00:05:00'  --延时5分钟
    commit tran
    --调用存储过程,然后在存储过程外面随便查询一个没有锁定的订单号,如果可能查出,证明行级锁生效,否则表示行级锁无效
      

  4.   

    waitfor delay '00:05:00'  --延时5分钟
    加上此语句后,查询其他订单没有问题!而且在五分钟内查询锁定的订单也没有问题!
    调试后证明行级锁生效!
    另外请问:
    如果这个处理量较大的话,尽量不要在同一个事务中处理,这个怎么处理呢?
      

  5.   

    重新调试一遍!
    waitfor delay '00:05:00'  --延时5分钟
    加上此语句后,在客户端执行此存储过程后引起一个超时错误,但其他客户的查询没有影响!
      

  6.   

    好象对事务设置应该用
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
      

  7.   

    晕,又调试了一遍,这回引出了一个超时错误!
    用sp_lock查看,发现出现四五个阻塞,都是与订单表和时间表有关的!请问 zjcxc(邹建),怎么改用行级锁才能生效!
      

  8.   

    看看这个,或许对你有所帮助
    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=207166