Sql Server 2005 - управляйте одновременным использованием таблиц - PullRequest
1 голос
/ 09 декабря 2008

У меня в приложении ASP.NET этот процесс:

  • Начать соединение
  • Начать транзакцию
  • Вставьте в таблицу «LoadData» множество значений с помощью класса SqlBulkCopy со столбцом, содержащим определенный LoadId.
  • Вызовите хранимую процедуру, которая:
    • читать таблицу «LoadData» для конкретного LoadId.
    • Для каждой строки выполняется много вычислений, что подразумевает чтение десятков таблиц и запись результатов во временную (#temp) таблицу (процесс, который длится несколько минут).
    • Удаляет строки в «LoadDate» для определенного LoadId.
    • Как только все будет сделано, запишите результат в таблицу результатов.
  • Фиксация транзакции или откат в случае сбоя.

Моя проблема в том, что если у меня есть 2 пользователя, которые запускают процесс, второму придется подождать, пока предыдущий закончил (потому что вставка, кажется, устанавливает исключительную блокировку на таблицу), и мое приложение иногда падает в таймаут (и пользователи не рады ждать :)).

Я ищу способ иметь пользователей, которые делают все параллельно, поскольку нет взаимодействия, кроме последнего: записи результата. Я думаю, что меня блокирует вставка / удаление в таблицу «LoadData». Я проверил другие уровни изоляции транзакций, но, похоже, ничто не могло мне помочь.

Что было бы идеально, если бы была возможность удалить монопольную блокировку для таблицы «LoadData» (можно ли заставить SqlServer блокировать только строки, а не таблицу?), Когда вставка завершена, но без завершения транзакции .

Есть предложения?

Ответы [ 3 ]

1 голос
/ 09 декабря 2008

Посмотрите УСТАНОВЛЕННЫЙ УРОВЕНЬ ИЗОЛЯЦИИ СДЕЛКИ, ЧИТАЙТЕ СОВЕРШЕННЫЙ СНИМОК в Книгах OnLine.

1 голос
/ 09 декабря 2008

, если вы уверены, что нет никаких проблем с операциями cioncurrent, кроме последней части, почему бы не начать транзакцию непосредственно перед этими последними утверждениями (в зависимости от того, что они требуют изоляции) и выполнить фиксацию сразу после их успешного завершения ... Затем все предварительные операции чтения не будут блокировать друг друга ...

1 голос
/ 09 декабря 2008

Транзакции должны охватывать небольшие и быстро исполняемые фрагменты SQL / кода. Они имеют тенденцию реализовываться по-разному на разных платформах. Они будут блокировать таблицы и затем расширять блокировку по мере роста модификаций, таким образом блокируя других пользователей от запроса или обновления той же строки / страницы / таблицы.

Почему бы не забыть транзакцию и обработать ошибки обработки другим способом? Действительно ли ваша целостность данных обеспечивается транзакцией или вы можете обойтись без нее?

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