Я написал многопоточное приложение, которое каждый поток вызывает процедуру sql-сервера. Мне нужно защитить строку от получения более одного потока. Я хочу, чтобы каждая строка принимала его только одним потоком. Я использовал этот код:Как я могу запустить процедуру по времени?
CREATE PROCEDURE GetRow
@ThreadID int
AS
BEGIN
DECLARE @rowID int;
SELECT TOP (1) @rowID=[ID] FROM [TestTable] WHERE [ThreadID] = 0 (AND some other parameters)
IF @rowID is not NULL
BEGIN
UPDATE TOP (1) [TestTable] SET [CallCount] = [CallCount]+1,[ThreadID] = @ThreadID WHERE [ID] = @rowID
--some other codes
END
END
как я сказал, что я запускаю приложение, а затем мое приложение создает 10 потоков, и я устанавливаю threadid для принятия строки только одним потоком, но я видел, что строка, вызываемая более чем 1 потоком и около 4-5 потоков, получает один строка .. как я могу сделать это наилучшим образом, я решил это с помощью этого кода, я не хотел бы иметь два одинаковых места, где в выборе и обновлении:
CREATE PROCEDURE GetRow
@ThreadID int
AS
BEGIN
DECLARE @rowID int;
UPDATE TOP (1) [TestTable] SET [CallCount] = [CallCount]+1,[ThreadID] = @ThreadID WHERE [ThreadID] = 0 (AND some other parameters)
SELECT TOP (1) @rowID=[ID] FROM [TestTable] WHERE [ThreadID] = @ThreadID (AND some other parameters)
IF @rowID is not NULL
BEGIN
--some other codes
END
END
Как я могу сделать это с помощью верхнего кода? и должен ли я сначала обновить, а затем выбрать, как указано выше, для его исправления?
Что вы пытаетесь достичь? Я попытался понять, но я не понял ... – jazzytomato
@ Томас Харатик извините, я действительно пытаюсь это объяснить .. Я не хочу выбирать специальную строку в более чем одном потоке .. Я написал процедуру обновления столбца theardid of row to don't позволяют другим потокам выбирать его, но в Sametime другие потоки выбирают его. –