Таблица Sql заблокирована Readpast - PullRequest
2 голосов
/ 12 апреля 2019

У меня есть представление SQL. Я использую READPAST в этом представлении SQL. Потому что я не хочу видеть грязные данные. Но SQL READPAST заблокировал эту таблицу SQL View. Я не хочу блокировать таблицу, я просто хочу заблокировать строку.

Какой метод является правильным?

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Когда вы выбираете из таблицы, вы все равно устанавливаете на нее общую блокировку ... но если ваша таблица заблокирована и вы не хотите видеть грязные данные рядом с использованием readpast, вы должны убедиться, что ваша таблица имеет индекс изатем отключите блокировку страницы и включите блокировку строки .. конечно, ваш запрос должен содержать предложение where для индексированного столбца .. https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-2017

0 голосов
/ 12 апреля 2019

Кажется, проблема в уровне изоляции. Вы должны использовать моментальный снимок чтения, если вы используете sql server. Это обеспечивает выборку только зафиксированных данных. Также это не вызывает блокировку таблицы. Но вы должны включить ее на уровне базы данных.можно посмотреть https://www.google.com/amp/s/www.red-gate.com/simple-talk/sql/performance/read-committed-snapshot-isolation-high-version_ghost_record_count/amp/ для конфигурации.Также readpast не является решением. Он пропускает заблокированные строки. Таким образом, вы получаете пропущенные результаты. Когда строка обновляется, ваш запрос на выборку игнорирует эту строку. Но на уровне фиксации чтения при чтении вы получаете зафиксированную версию этой строки, даже если заблокирована другой транзакциейи этот уровень изоляции не блокирует вашу таблицу. Я предполагаю, что вы используете уровень изоляции по умолчанию для транзакции. Если вы не устанавливаете уровень изоляции для транзакции, он использует уровень изоляции по умолчанию, и это считывается зафиксированным снимком.читать зафиксированный уровень изоляции без блокировки. За исключением этого, например, в сериализуемом уровне изоляции он продолжает блокироваться. Поэтому вы можете использовать уровень изоляции по умолчанию для транзакции, вызывающей ваше представление.

...