Я пытаюсь выполнить задачу в SQL Server. Я делюсь примером проблемы, так как не могу поделиться полным описанием задачи.
Проблема: у нас есть таблица с именем Person
:
Person_Id Person_Name Person_Age
--------- ----------- ----------
1 AAA 25
2 BBB 25
3 CCC 25
4 DDD 25
Из этой таблицы я хочу использовать Person_Id = 4
, который будет храниться внутри TRANSACTION
.
Person_Id Person_Name Person_Age
--------- ----------- ----------
4 DDD 25
При выполнении вышеуказанной транзакции пользователь хочет получить доступ (INSERT, UPDATE, DELETE
) ко всем другим записям (кроме Person_Id = 4
), которые находятся в таблице, как показано ниже:
Person_Id Person_Name Person_Age
--------- ----------- ----------
1 AAA 25
2 BBB 25
3 CCC 25
Что я пробовал:
Я пытался с NOLOCK, ROWLOCK
, но не смог этого добиться. Пожалуйста, помогите мне достичь этого сценария. Я также попробовал эту ссылку . По этой ссылке, используя
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
запрос SELECT
извлекает неизмененные данные. Например, если я пытаюсь UPDATE
записать в TRANSACTION
, и запись была обновлена, но TRANSACTION
занят выполнением других операторов.
Person_Id Person_Name Person_Age
--------- ----------- ----------
4 DDD 25
Теперь, когда другие соединения пытаются SELECT
записей в таблице, будут возвращены все другие записи вместе с записью: Person_Id = 4
(со старым значением).
SERIALIZABLE Определяет следующее:
Заявления не могут прочитать данные, которые были изменены, но еще не
совершенные другими транзакциями.
Исходя из вышесказанного, когда я использую SERIALIZABLE
изоляцию, он по-прежнему возвращает более старую запись Person_Id = 4
. Это я не хочу в этом случае.
Я хочу получить все остальные записи, кроме записей в TRANSACTION
.
Другими словами, если запись (и) заблокирована в TRANSACTION
, то эта запись (записи) не должна появляться ни в каком другом SELECT STATEMENT EXECUTION
с другими соединениями.