2012-11-02 34 views
0

我想得到一个改善我的设置,导致sql服务器返回死锁消息的建议。我有多个实际使用TaskParallel库的线程应用程序,每个任务将使用存储过程从表中选择一个ID用于处理。我立即从同一个陈述中的表中删除该ID,我认为这是造成死锁的原因。该表由一列没有索引的唯一标识符组成。我想定期进行批量删除,但这意味着要在多个服务器上保留一个使用ID的记录。死锁事务 - 通信缓冲区资源

这里是我的SQL存储过程:

CREATE PROCEDURE [dbo].[get_Ids] 
    @id nvarchar(20) OUTPUT 

    AS 

    BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
    SET NOCOUNT ON; 

     Select top 1 @id = siteid from siteids 
     delete siteids where siteid = @id 



    END 

有没有什么更好的方法来做到这一点?我的流程工作速度非常快,我曾经从webrequest服务请求这个ID,但这需要3秒钟。

回答

1

有些事情可以尝试: 也许试试暗示数据库,你会删除你刚才选择的记录,这样它会抢得早。为此,您需要将整个过程包含在事务中,然后提示select。应该是这个样子:

BEGIN TRANSACTION 
    SELECT TOP 1 @id = siteid from siteids WITH (UPDLOCK, HOLDLOCK) 
    DELETE siteids WHERE siteid = @id 
COMMIT TRANSACTION 

同时确保siteid列索引(或者将其标记为主要关键,因为你说这是唯一的),否则将不得不扫描表以获得记录删除,这可能会使死锁变得更糟,因为它花费了更多时间删除。

对于通常的死锁,运行SQL分析器并查看死锁图的外观 - 可能是其他事情正在进行。

+0

感谢您的回复。他的事业将会每天处理大约5000万次交易,每秒处理多个线程。我会尽力而为。 – vbNewbie

+0

@vbNewbie其他简单的选择方式并不多。把它放在原处,添加siteid索引并查看它的行为。如果还存在问题 - 请再次提供新的细节。它可能更快与整数,而不是nvvarchar siteid请参阅[链接](http://stackoverflow.com/questions/3284297/sql-server-int-vs-nvarchar-comparison-on-performance)。 – MaximR

+0

我仍然遇到死锁,但只是添加代码重试,我认为这是至少我的处理速度比以前更快。我想知道,因为我插入到同一个数据库中的表中,这对工作负载也会产生影响。 – vbNewbie