Может ли база данных SQL Server ответить во время транзакции? - PullRequest
2 голосов
/ 27 ноября 2009

Я использую .Net 2.0, ADO.NET, набор данных и адаптеры данных для управления моими данными и Microsoft SQL Server 2005 в качестве менеджера базы данных.

У меня есть приложение, которое генерирует большое количество результатов (500K +) и сохраняет их в базе данных. Если один из результатов генерации не удастся, я бы не хотел сохранять ни один из результатов. Поэтому я поместил все вставки базы данных в транзакцию, которая откатывается, если результат не может быть сгенерирован.

Однако таблица блокируется до тех пор, пока не будут записаны все результаты, что я не планировал. Или, по крайней мере, я предполагаю, что он заблокирован, ни один запрос SELECT не отвечает, пока вставка не закончится.

Есть ли способ заставить транзакцию не блокировать таблицу, когда транзакция активна?

Является ли хорошей идеей использовать транзакцию с таким количеством вставок?

Ответы [ 2 ]

2 голосов
/ 28 ноября 2009

Вы можете использовать временный промежуточный стол. Заполните его в своем темпе. Затем выполните последнее перемещение с одним SELECT INTO в качестве одной транзакции. После того, как большое движение сделано, опустите промежуточный стол.

Если существуют некоторые более строгие ограничения в отношении общей целостности, вы можете ввести больше облегченных таблиц, таблиц, отражающих этапы потока данных, таблицы журнала / журнала. Некоторые процедуры восстановления / компенсации / очистки и т. Д.

2 голосов
/ 27 ноября 2009

Возможно, вы захотите разбить транзакцию на более мелкие партии, совершая транзакции после каждого 1К или около того.

Вы можете обойти блокировку, указав подсказку WITH (NOLOCK) в вашем операторе select (поместите его сразу после имени таблицы), но будьте очень осторожны, поскольку он будет читать данные, которые не совершено (то есть то, что может быть откатано). Существует также подсказка WITH (ROWLOCK) , которую можно использовать с вашей вставкой, что может снизить вероятность блокировки выбора (блокировка все равно будет происходить, если вы попытаетесь получить доступ к строке, которая была вставлена незафиксированная транзакция, но SQL не снимет блокировки всей таблицы, поэтому она менее вероятна).

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

...