SQL Server的并发性问题

duanzhi1984 2011-06-07 11:00:06
我有一存储过程,里面有事务,并且调用另外一个存储过程.

现在的问题是:

有六台电脑以每两秒的速度进行调用这个过程.

过程中有更新某几个表的逻辑.



现在的问题是:
经常出现,此事务被死锁,成为牺牲品......


如何能够避免类似的问题发生...请在这方面有经验的朋友们讨论讨论...
如何做到并发而不死锁.



假设存储过程是:

CREATE PROC TEST
@ID VARCHAR(10)
AS
BEGIN

UPDATE TB SET Cust='abc' where ID=@ID

UPDATE TBS SET Cust='abc' where ID=@ID

END

...全文
119 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
botao2690 2011-06-08
  • 打赏
  • 举报
回复
解决办法
1、使用排序,可以用一个单独的表存储要执行的语句,然后用定时任务的方式,用动态语句顺序处理,并加以标示。同二楼思想。
2、使用锁:可以使用(nolock),UPDATE TB SET Cust='abc' where ID=@ID
改为 UPDATE a SET Cust='abc' from tb a(nolock) where ID=@ID
但这样很可能造成数据错误。
3、检查索引对表的数据存储影响。SQl默认以页存储,在同一页的数据会发生冲突。
Atlantis 2011-06-08
  • 打赏
  • 举报
回复
另外二楼说的也要看下,除了对表以外,一些语句对索引的加锁顺序不一致也可能会导致死锁
Atlantis 2011-06-08
  • 打赏
  • 举报
回复
查查还有没有其他的存储过程中存在更新多个表的事务,并且更新表的顺序和这个存储过程以及被调用的存储过程中更新表的顺序是相反的,比如这个存储过程或被这个存储过程调用的那个更新的顺序是update a,update b,查查有没有先update b,后update a的存储过程,有的话改成顺序一致
迷途的书童 2011-06-07
  • 打赏
  • 举报
回复
一般建议,如果有个服务器来统一运行所有的存储过程!

当有六台电脑连到服务器,服务器运行完存储过程后给返回值,
服务器在运行某个特定的存储过程的时候用临界区来避免竞争和死锁!
东那个升 2011-06-07
  • 打赏
  • 举报
回复
ID 有索引么

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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