Я пытался понять ROWLOCK в SQL-сервере, чтобы обновить запись после ее блокировки. Вот мое наблюдение и я хотел бы получить подтверждение, похож ли ROWLOCK на блокировку таблицы или страницы, или я не пробовал это правильно. ROWLOCK должен быть блокировкой только для строки, а не для таблицы или страницы.
Вот что я пробовал:
Я создал простую таблицу: row_lock_temp_test
с двумя столбцами ID и Имя без PK или индекса. Теперь я открываю SQL Server, два разных клиента, но с одинаковыми учетными данными, и пробую выполнить набор следующих запросов:
Клиент 1:
1: BEGIN TRANSACTION;
2: update row_lock_temp_test set name = 'CC' where id = 2
3: COMMIT
Клиент 2:
1: BEGIN TRANSACTION;
2: update row_lock_temp_test set name= 'CC' where id = 2
3: COMMIT
Я выполнил запросы 1, 2 на C-1 и перешел к C-2 и выполнил те же запросы, оба клиента выполнили запросы, а затем я зафиксировал транзакцию, все в порядке.
Затем я добавил RowLock для обновления запроса,
C-1
1: BEGIN TRANSACTION;
2: update row_lock_temp_test WITH(rowlock) set name = 'CC' where id = 2
3: COMMIT
C-2
1: BEGIN TRANSACTION;
2: update row_lock_temp_test WITH(rowlock) set name = 'CC' where id = 2
3: COMMIT
Теперь я выполнил запросы 1 и 2 на C-1, а затем перешел к C-2 и попытался выполнить те же 2 запроса, но запрос застрял, как и ожидалось, потому что строка заблокирована C-1, поэтому она должна находиться в очереди до тех пор, пока транзакция совершена на C-1. как только я совершил транзакцию на C-1, запрос на C-2 был выполнен, а затем я зафиксировал транзакцию и на C-2. Все хорошо.
здесь я попробовал другой сценарий для выполнения того же набора запросов с идентификатором строки = 3
C-2
1: BEGIN TRANSACTION;
2: update row_lock_temp_test WITH(rowlock) set name = 'CC' where id = 3
3: COMMIT
Я выполнил первые два запроса в C-1, а затем перешел к выполнению первых двух запросов из C-2, идентификатор строки отличается у обоих клиентов, но все же запрос в C-2 застрял. Это означает, что при обновлении запроса с id = 2 он заблокировал страницу или таблицу, я ожидал блокировки строки, но это похоже на блокировку страницы или таблицы.
Я также пробовал использовать xlock, HOLDLOCK и UPDLOCK с разными комбинациями, но он всегда блокирует таблицу. есть ли возможность заблокировать только строку.
Выбор и вставка работают должным образом.
Заранее спасибо.