日期:2014-05-18  浏览次数:20487 次

SQL Server的并发性问题
我有一存储过程,里面有事务,并且调用另外一个存储过程.

现在的问题是:

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

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



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


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



假设存储过程是:

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



------解决方案--------------------
ID 有索引么
------解决方案--------------------
一般建议,如果有个服务器来统一运行所有的存储过程!

当有六台电脑连到服务器,服务器运行完存储过程后给返回值,
服务器在运行某个特定的存储过程的时候用临界区来避免竞争和死锁!
------解决方案--------------------
查查还有没有其他的存储过程中存在更新多个表的事务,并且更新表的顺序和这个存储过程以及被调用的存储过程中更新表的顺序是相反的,比如这个存储过程或被这个存储过程调用的那个更新的顺序是update a,update b,查查有没有先update b,后update a的存储过程,有的话改成顺序一致
------解决方案--------------------
解决办法
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默认以页存储,在同一页的数据会发生冲突。