Выберите и вставьте одновременно SQL 2016 - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть простая таблица в моем приложении, где

ID |ЦЕННОСТЬ |ДАТА |ITEMID

Все время, когда некоторые элементы вставляют данные, выбрасывает мой веб-сервис в эту таблицу.Я вставляю только те данные, которые 5 или более минут.В то же время, когда я использую свое веб-приложение, я выбираю некоторые максимальные, минимальные и текущие значения для элементов.Время от времени я получал

Транзакция (ID процесса 62) блокировалась на ресурсах блокировки с другим процессом и выбиралась в качестве жертвы тупика.Перезапустите транзакцию.

Есть ли шанс получить данные, и на тот момент, когда я выбираю, не заботятся о вставках?

Ответы [ 3 ]

2 голосов
/ 01 апреля 2019

Вы можете использовать with(nolock) подсказку, Это даст вам незафиксированные данные.

Смотрите ответ здесь Что такое «с (nolock)» в SQL Server?

И здесь http://sqlserverplanet.com/tsql/using-with-nolock

1 голос
/ 03 апреля 2019

При использовании Sql Server 2016:

Проблема: Когда мы пишем Select оператор shared locks хранится на ресурсах, скажем, TableX, из которого выбираются максимальные, минимальные и текущие значения. Теперь на данный момент, если вы Insert данных в этих заблокированных таблицах (TableX), то, поскольку Insert требует блокировки Exclusive для ресурса (TableX), оператор Insert будет ожидать получения Select завершено.

Решение: Как предлагается в постах ниже, мы можем использовать with (nolock) or with (read uncommitted) табличные подсказки, чтобы операторы Select не блокировали базовые ресурсы (TableX). Но проблема в том, что Select может считывать незафиксированные данные, которые были изменены во время транзакции, а затем впоследствии были возвращены в исходное состояние (также называемое чтением грязных данных).

Если вы хотите убедиться, что Select читает зафиксированные данные, а также не блокировать Inserts для записи в TableX, то на уровне базы данных SET READ_COMMITTED_SNAPSHOT ON.

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

Вы можете изменить запрос на выборку, чтобы избежать взаимных блокировок:

ВЫБЕРИТЕ ПУНКТ, МАКС. (ЗНАЧЕНИЕ), МИН. (ЗНАЧЕНИЕ) ИЗ ИМЯ_ЗАПИСИ С (НОЛК.), ГРУППА ПО ПУНКТУ, ДАТА

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