使用SQL进行多线程 - 哪些表提示用于Select?

时间:2015-05-24 10:13:03

标签: sql-server multithreading

我有一个多线程的C#应用​​程序。应用程序的目的是找到存储在SQL服务器表中的可用代理服务器以进行连接。

该表包含 200个代理。允许的最大并发代理连接数为5。

该表格包含以下列:

(ProxyId int,IpAddress varchar,IsSocks bit,ConnectStatus tinyint,LastConnected datetime)

ProxyId是一个标识列,ConnectStatus有3个值

  • 0:可用(由C#app更新)
  • 1:连接到(在sp下面更新)
  • 2:已连接(由C#app更新)

我定义了以下存储过程,它将从C#app中调用:

Create Proc GetNextAvailableProxy

AS

Declare @proxyId int, @ipAddress varchar(20), @isSocks bit

if (Select Count(*) From Proxies Where ConnectStatus > 0) < 5 Begin

    Select Top 1 @proxyId = Id, @ipAddress= IpAddress, @isSocks = IsSocks 
    From Proxies with (updlock, readpast) 
    Where ConnectStatus = 0
    Order By IsNull(LastConnected, '1970-01-01')

    Update Proxies Set ConnectStatus = 1
    Where Id = @proxyId

    Select @proxyId ProxyId, @ipAddress IpAddress, @isSocks IsSocks;

    return;
End

Select Null ProxyId, Null IpAddress, Null IsSocks

GO

以上sp获取下一个可用代理,如果有5个代理连接或连接,则C#app会收到Null for proxyId并等待2秒再重试。

成功建立代理连接时,C#应用程序将设置ConnectStatus = 2,完成工作后,ConnectStatus = 0。

我的问题:我的sp是否正确选择了表提示?我不知道我应该在Select Count(*)语句中放置什么表提示。

0 个答案:

没有答案