Общий ответ на вопрос, который вы задаете, заключается в том, что да, вам нужно иметь какой-то столбец идентификатора сеанса в вашей таблице и передавать значение в нем для каждого пользователя / сеанса вместе со всеми хранимыми процедурами и / или SQLзаявления, которые работают на этом столе.
Альтернативой является то, что да, вы можете установить уровень изоляции на Serializable, и ваши пользователи будут стоять в очереди один за другим, ожидая, пока все перед ними не закончат, и позволят SQL Server справиться с этим, но это почти никогдачто вы хотите сделать.
Итак, для первого варианта вы получите что-то вроде:
YourTable
ID DataCol1 DataCol2 DataCol3 .... User/SessionID
Таким образом, пользователь входит в систему / запускает сеанс на вашем сайте.Вы используете их ID или генерируете для них SessionID и передаете его
StoredProc1ClearSession @UserSessionID
StoredProc2InsertNewData (AnyOtherParamsYouHave),@UserSessionID
StoredProc3RetrieveData (AnyOtherParamsYouHave),@UserSessionID
.
По сути, если каждый оператор SQL, который вы используете для прикосновения к таблице, входит в предложение WHERE или оператор вставки:
UserSessionID or @UserSessionID
, то вы, вероятно, уже на пути ктаблица, которая может быть безопасно использована несколькими пользователями одновременно, как вы описали.
Для второго варианта, пожалуйста, прочитайте это , чтобы понять, во что вы ввязываетесь.:)
Затем введите код, подобный этому
CREATE PROC yourstoredproc
paramaterslisted
AS
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
YOURCODE TOUCHING TEMPTABLE HERE
COMMIT TRANSACTION;
На всякий случай, если вы не прочитаете ссылку:
SERIALIZABLE Указывает следующее:
Это блокирует другие транзакции от обновления или вставки любых строк, которые соответствуют требованиям любого из операторов, выполняемых текущей транзакцией.Это означает, что если какой-либо из операторов в транзакции выполняется во второй раз, они будут читать тот же набор строк.Блокировки диапазона удерживаются до завершения транзакции.Это наиболее ограничивающий уровень изоляции, поскольку он блокирует все диапазоны ключей и удерживает блокировки до завершения транзакции.Поскольку параллелизм ниже, используйте эту опцию только при необходимости.Этот параметр имеет тот же эффект, что и установка HOLDLOCK для всех таблиц во всех инструкциях SELECT в транзакции.