Скажем, у меня есть следующие SQL заявления, которые я выполнения, используя ExecuteNonQuery(DbCommand)
из C# в веб-приложениеВыполнить один SQL блок без прерывания
DECLARE @InsertedProductID INT -- this is passed as a parameter
DECLARE @GroupID INT -- this is passed as a parameter
DECLARE @total INT
SET @total = (SELECT COUNT (*) FROM Products WHERE GroupID = @GroupID)
UPDATE Products SET ProdName = 'Prod_'+ CAST(@total as varchar(15))
WHERE ProductID = @InsertedProductID
Моя проблема заключается в том, что я хочу, чтобы гарантировать, что весь блок выполняется в один. Моя цель - всегда иметь ProdName
уникальных для каждой группы. Если я оставлю все так, как есть, есть хороший шанс, что я получу повторяющиеся названия продуктов, если между @total
и UPDATE
произошел insert
. Есть ли способ убедиться, что весь блок SQL выполняется сразу без прерывания. Будет ли exec
или sp_executesql
достичь этого? Моим последним средством было бы поставить lock
вокруг ExecuteNonQuery(DbCommand)
Но мне это не нравится, поскольку это создаст узкое место. Я не думаю, что использование транзакции sql полезно здесь, потому что я не беспокоюсь о целостности команд, я скорее беспокоюсь о параллельности команд.