У меня есть таблица, похожая на эту ...
CREATE TABLE [Customer]
(
[Id] BIGINT IDENTITY NOT NULL,
[AccountName] CHARACTER VARYING(255),
CONSTRAINT [PK_Customer_Id] PRIMARY KEY ([Id]),
CONSTRAINT [UQ_Customer_AccountName] UNIQUE ([AccountName])
)
Я хочу выполнить этот запрос одновременно из многих приложений ...
IF NOT EXISTS(SELECT [AccountName] FROM [Customers] WITH (UPDLOCK, HOLDLOCK) WHERE [AccountName] = 'SuperCustomer') THEN
BEGIN
INSERT INTO [Customers] ([AccountName]) VALUES ('SuperCustomer');
END
Может ли WITH (UPDLOCK, HOLDLOCK)
предотвратить одновременное выполнение этого запроса от попытки вставки с тем же значением AccountName
, даже если строка еще не существует , удерживая блокировку обновления для индекса несуществующих данных ? Я хочу избежать завершения из-за уникального нарушения ограничения на AccountName
в таблице Customer
в всех случаях, если пользователь пытается отправить одного и того же клиента для создания дважды в одно и то же время или в большом объеме злонамеренно по любой причине. Мы работаем с SET XACT_ABORT ON
, и это будет внутри транзакции, которая находится на уровне изоляции READ COMMITTED
.