Изменение таблицы для обработки SPID - PullRequest
0 голосов
/ 26 декабря 2011

У меня есть таблица, в которой новые данные заполняются каждый раз, когда пользователь щелкает опцию на моем веб-сайте.Я создал эту таблицу с помощью Management Studio, и я хочу уточнить, что я не создаю эту таблицу каждый раз с помощью хранимой процедуры и не использую какие-либо временные таблицы в памяти.

Всякий раз, когда пользователь щелкает опцию на моемвеб-сайт, старые записи из этой таблицы сначала удаляются, а новые записи заполняются.Меня беспокоит проблема параллелизма, которая может возникнуть, когда многие пользователи нажимают одну и ту же опцию на моем веб-сайте.Я не знаю, как SQL Server будет обрабатывать множественные удаления и вставки в эту таблицу.

Я где-то читал, что службы SQL Server автоматически решают эту проблему с отдельной копией таблицы для каждого сеанса для каждого сеанса..

Есть ли необходимость добавить SPID в мою таблицу или об этом автоматически позаботятся?Нужно ли менять уровень изоляции с Read Committed на Serializable?

Ответы [ 2 ]

1 голос
/ 27 декабря 2011

Упомянутая вами «отдельная копия для сеанса» звучит как изоляция моментального снимка, которая по умолчанию не включена.

Хотя специфика в некоторой степени зависит от того, какие другие транзакции вы выполняете одновременно, в целомдолжно быть достаточно просто обернуть команды DELETE и INSERT в одну транзакцию.Вам не нужно повышать уровень изоляции.

BEGIN TRAN
DELETE ...
INSERT ...
COMMIT TRAN
1 голос
/ 26 декабря 2011

Общий ответ на вопрос, который вы задаете, заключается в том, что да, вам нужно иметь какой-то столбец идентификатора сеанса в вашей таблице и передавать значение в нем для каждого пользователя / сеанса вместе со всеми хранимыми процедурами и / или 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 в транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...