Sql Server 2005 - управление параллелизмом на столах

голоса
1

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

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

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

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

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

Любое предложение?

Задан 09/12/2008 в 14:38
источник пользователем
На других языках...                            


3 ответов

голоса
1

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

Ответил 09/12/2008 в 15:24
источник пользователем

голоса
1

Посмотрите SET TRANSACTION ИЗОЛЯЦИЯ LEVEL READ COMMITTED SNAPSHOT в Books Online.

Ответил 09/12/2008 в 15:04
источник пользователем

голоса
1

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

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

Ответил 09/12/2008 в 14:43
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more