Как заблокировать таблицу для вставки в SQL? - PullRequest
1 голос
/ 26 марта 2010

У меня есть веб-приложение, в котором у меня есть страница с именем «Данные». Многие люди будут пытаться вставить данные в таблицу в определенный момент времени. Таким образом, ссылка, кроме первичного ключа, будет дублирована, что недопустимо. Для вставки данных в таблицу БД я использую хранимую процедуру в SQL. В моем веб-приложении vb.net я использую бизнес-уровень с корпоративной библиотекой для вызова хранимой процедуры. Теперь я хочу заблокировать таблицу для вставки, чтобы при вставке нескольких пользователей не было никаких сложностей. Как я могу это сделать? Пожалуйста, сообщите.

Я не имел в виду первичный ключ. У меня есть поле первичного ключа, а именно InvoiceID, который не дублируется. Но наряду с этим мне нужен «InvoiceNo», который также не должен дублироваться. Это автоматически заполняется из ранее введенного «InvoiceNo» + 1, который будет дублироваться, если несколько пользователей попытаются вставить одновременно.

Привет

Ответы [ 4 ]

3 голосов
/ 26 марта 2010

Не. Даже не думай об этом. Вы убьете любую производительность и параллелизм, которые у вас есть.

Вам необходимо выяснить, почему у вас дублирующиеся значения PK. Если вы оставите это на усмотрение самой базы данных, например, используя столбец INT IDENTITY, вам не придется ни о чем беспокоиться. SQL Server позаботится о том, чтобы эти значения действительно всегда были уникальными.

Так что, на самом деле, рекомендация такова: переделайте свое решение и позвольте базе данных обрабатывать уникальность идентификаторов - тогда вам вообще не понадобится ни блокировка, ни что-либо еще.

1 голос
/ 26 марта 2010

Какие осложнения вас беспокоят? Параллельные вставки обычно работают нормально без явной блокировки.

0 голосов
/ 14 сентября 2013

Я полностью понимаю, что имею дело с бухгалтерами, которые не хотят, чтобы номер счета-фактуры, показанный клиенту, был первичным ключом - не удивлюсь, обнаружив, что ваш "номер счета-фактуры" фактически должен быть строкой, состоящей из скажем, № клиента, за которым следует тире, затем номер их счета или что-то в этом роде. Возможно, вы могли бы использовать дополнительную таблицу, на которую вы ссылаетесь, вместо триггера вставки в вашей таблице счетов. Вам, увы, придется разрешить триггеру замедлить вставку до уровня производительности курсора; но большинство бизнес-кейсов, о которых я знаю, не будут генерировать огромное количество счетов одновременно с критическими ограничениями по времени и минутой. Вы бы сделали что-то вроде этого ...

создать таблицу invoiceNumbers (invNumber int, не нулевой идентификатор первичного ключа)

Тогда вы бы вместо таблицы вставили в таблицу счетов-фактур триггер вставки, который будет перебирать вставленную таблицу с помощью курсора; для каждой строки вставляется новая строка в invoiceNumbers, извлекается значение scope_identity (), а затем вставляется счет-фактура (с новым номером счета-фактуры) в таблицу счетов-фактур. Это замедлит вставку некоторых счетов, но вы НЕ столкнетесь с проблемой параллелизма, которая, IMHO, намного хуже, чем проблема скорости курсора, а не набора логики.

0 голосов
/ 26 марта 2010

Не могли бы вы просто уточнить проблему. Может быть, я просто не понимаю этого. однако, если у вас есть первичный ключ, установленный с помощью параметра Идентификационная вставка в базе данных, вы можете вызывать хранимую процедуру вставки столько раз, сколько захотите (в пределах разумного), и SQL Server убедится, что каждый из них вставлен в порядке. Пока вы не слишком беспокоитесь о точном порядке их вставки или о чем-то подобном.

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

Извинения, если это не ответило на вопрос.

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