SQL - почему запрос SELECT был заблокирован INSERT? - PullRequest
1 голос
/ 19 мая 2019

Я всегда думал, что писатели никогда не блокируют читателей (и наоборот).

Однако то, что я вижу сейчас, очень странно.Я, наверное, не прав и что-то здесь не хватает.Поэтому, пожалуйста, помогите, поскольку это сводит меня с ума!

Сегодня я создал очень простую таблицу:

USE [testdb]
GO

CREATE TABLE [dbo].[MyTab](
    [N] [int] NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[MyTab]  WITH CHECK ADD CHECK  (([n]>(10)))
GO

Затем я заполнил ее несколькими строками.

Далее я решил установить IMPLICIT_TRANSACTIONS на ON и выбрать из таблицы в другом сеансе совершенно отдельное выполнение SQL Server Management Studio.Приведенный ниже снимок демонстрирует, что произошло:

enter image description here

Вы видите проблему?Запрос на выбор все еще выполняется!Этот запрос никогда не возвращается.Он возвращается только после того, как я зафиксировал или откатил оператор вставки.Я тестировал один и тот же сценарий несколько раз, и одно и то же происходило снова и снова.

Чтобы дополнительно подтвердить мои наблюдения, взгляните на приведенный ниже отчет:

enter image description here

Можете ли вы помочь и сообщить, что я делаю не так?

или если мое предположение о том, что читатели не могут быть заблокированы, полностью (или частично) неверно?

Спасибо!

Примечание. Изначально я был подключен к тому же пользователю, что и вставкасеанс, когда я хотел запросить таблицу.Как только я увидел, что мой выбор был заблокирован, я решил войти в систему и протестировать, используя другого пользователя.Следовательно, использование в качестве учетной записи 'sa'.:)

Ответы [ 2 ]

2 голосов
/ 19 мая 2019

Считыватели не блокируют средства записи (и наоборот) в SQL Server, если включить параметр базы данных READ_COMMITTED_SNAPSHOT.Затем SQL Server будет использовать управление версиями строк вместо блокировок, чтобы обеспечить согласованность чтения для транзакций READ_COMMITTED, которые ведут себя аналогично СУБД Oracle, с которой вы более знакомы.

READ_COMMITTED_SNAPSHOT включено по умолчанию для базы данных SQL Azure, но не в предварительных версиях SQL Server для обратной совместимости.

2 голосов
/ 19 мая 2019

После некоторого исследования я просто понял, в чем проблема. В SQL Server читатели и писатели иногда блокируют друг друга. В отличие от Oracle, где читатели и писатели никогда не блокируют друг друга.

Дополнительные пояснения

Я являюсь администратором базы данных Oracle и не знаю слишком много о базах данных SQL Server. Мои сегодняшние наблюдения стали неожиданностью для меня, потому что в Oracle я никогда не видел, чтобы запрос на выборку блокировался оператором вставки, потому что согласно документации Oracle :

Читатели и писатели не блокируют друг друга в базе данных Oracle. Поэтому, хотя запросы все еще видят непротиворечивые данные, оба читают преданная и сериализуемая изоляция обеспечивает высокий уровень параллелизм для высокой производительности, без необходимости чтения незафиксированные данные.

Это полностью отличается от SQL Server, где запросы чтения могут быть заблокированы при определенных обстоятельствах .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...