Рассмотрим эту простую таблицу: ![enter image description here](https://i.stack.imgur.com/bJwTN.jpg)
оператор создания таблицы:
CREATE TABLE [dbo].[Test_Serializable](
[Id] [int] NOT NULL,
[Name] [nvarchar](50) NOT NULL
)
, поэтому нет никакого первичного ключа или индекса.
считают его пустыми не имеет никакой строки. Я хочу вставить эту строку (1,'nima')
, но я хочу проверить, есть ли строка с Id=1
или нет. Если да, вызовите RAISERROR
и, если нет, введите строку. Я пишу этот сценарий:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRY
BEGIN TRAN ins
IF EXISTS(SELECT * FROM Test_Serializable ts WITH(xlock,ROWLOCK) WHERE ts.Id=1)
RAISERROR(N'Row Exists',16,1);
INSERT INTO Test_Serializable
(
Id,
[Name]
)
VALUES
(
1,
'nima'
)
COMMIT TRAN ins
END TRY
BEGIN CATCH
DECLARE @a NVARCHAR(1000);
SET @a=ERROR_MESSAGE();
ROLLBACK TRAN ins
RAISERROR(@a,16,1);
END CATCH
этот скрипт работает нормально, но есть интересный момент.
Я запускаю этот скрипт из 2-х SSMS и шаг за шагом запускаю эти 2 скрипта (в режиме отладки). Однако мой интересный моментТаблица не имеет строки, но один из сценариев, когда оператор IF EXIST
блокирует таблицу.
Мой вопрос заключается в том, блокирует ли (XLOCK,ROWLOCK)
всю таблицу из-за отсутствия строки? Или блокирует фантомную строку :) !!???
Редактировать 1)
Это мой сценарий:
У меня есть таблица, например, с 6 полями
![enter image description here](https://i.stack.imgur.com/tOMOC.jpg)
это правила уникальности:
1) уникальность City_Code + F1_Code
2) уникальность City_Code + F2_Code
3) City_Code + F3_Code + F4_Code имеют uinque
проблема в том, что пользователь может захотеть заполнить city_code
и F1_Code
, и когда он захочет вставить его в другие поля, мы должны иметь Empty String
или 0
(для числовых полей) значение.
Если пользователь хочет заполнить City_Code + F3_Code + F4_Code, тогда F1_Code и F2_Code должны иметь Empty String
значения
Как я могу проверить это лучше?Я не могу создать уникальный индекс для каждого правила