none
Доступ к таблице БД из двух параллельных потоков RRS feed

  • Вопрос

  • Добрый день,

    Есть 2 параллельных потока которые записывают данные в таблицу SQL.
    Как исключить одновременный доступ к таблице, как поставить задачи по записи в эту таблицу в пулл?

    Заранее благодарен за ответы.
    • Перемещено Tagore Bandlamudi 1 октября 2010 г. 22:49 MSDN Forums consolidation (От:Visual C#)
    3 марта 2010 г. 8:00

Ответы

  • 100% да.
    На более низком уровне SQL Server сам расставит все необходимые блокировки на таблицы, сам проверит существующие и сам роешит проблемы если возникнут дедлоки и прочее.
    • Помечено в качестве ответа EgoZa 3 марта 2010 г. 12:18
    3 марта 2010 г. 11:00
  • Проверки на противоречивость не будет, по крайней мере в этой ситуации.
    Вставки приходят не одновременно, всегда есть первая и вторая. Если они пересекаются по времени, то получается примерно следющее:
    1. Сервер получает первую вставку. Создает транзакцию с уровнем read committed
    2. Блокирует чтение и запись в таблицу (т.к. сейчас в нее будут записаны данные, и их нельзя позволить прочитать до коммита транзакции)
    3. Пишет данные первой вставки
    4. Внезапно приходит вторая вставка. Создается вторая транзакция.
    5. При попытке вставить данные сервер обнаруживает блокировку на запись, и ждет
    6. Первая вставка завершается, первая транзакция коммитается, блокировки снимаются.
    7. Сервер продолжает вторую вставку.
    • Предложено в качестве ответа Nikonorov Evgeniy 3 марта 2010 г. 11:38
    • Помечено в качестве ответа EgoZa 3 марта 2010 г. 12:17
    3 марта 2010 г. 11:06

Все ответы

  • Почитайте про транзакции и блокировки
    в вашем случае будет полезно разобраться c IsolationLevel 

    Isolation на стороне SQL Server
    опишите задачу более подробно

    p.s. SQL Server сам контролирует такие случаи и при одновременной вставке исключительных ситуаций не произойдет,
    вам не нужно думать о пуле задач
    • Предложено в качестве ответа Nikonorov Evgeniy 3 марта 2010 г. 11:37
    3 марта 2010 г. 8:10
  • Попробую более подробно

    Суть программы - Берем строки из интернета и вставляем в БД.

    Взять строку - занимает некоторое время, поэтому нужно запустить несколько параллельных
    процессов.

    Как получили строку - вставляем ее в БД.

    Вызывает беспокойство то, что при параллельном доступе к таблице какой-то из
    процессов вставить строку не сможет.

    Вот и думаю, как организовать вставку, чтобы процессы по вставке строк вставали в
    очередь.

     

    3 марта 2010 г. 8:38
  • у вас случились прецеденты? Я уверен что вставка будет без проблем. главное соблюдайте следующее правило:
    открывайте конект к бд как можно позже - только в тот момент когда соберетесь вставлять строку,
    затем выполняйте операцию инсерта
    а закрывайте - как можно раньше(как только вставили строку).

    проблем быть не должно

    3 марта 2010 г. 9:02
  • Нет, проблем пока небыло, но если б было понимание, по какой причине такого быть не может, было бы легче.
    3 марта 2010 г. 9:09
  • Это зона ответсвенности SQL server, он сам ставит запросы в очереди и следит за тем чтобы не было блокировок, ведет пул соединений и прочее.
    Вы можете повлиять на его поведение с помощью уровней изоляций транзакций и настроек подключения

    3 марта 2010 г. 9:57
  • Т.е. , если я правильно понял, если к SQL server приходят 2 транзакции для одной таблицы в одно и тоже время, и если эти транзакции не противоречят друг другу (в моем случае это простая вставка новой строки), SQL их обработает. Так?
    3 марта 2010 г. 10:35
  • 100% да.
    На более низком уровне SQL Server сам расставит все необходимые блокировки на таблицы, сам проверит существующие и сам роешит проблемы если возникнут дедлоки и прочее.
    • Помечено в качестве ответа EgoZa 3 марта 2010 г. 12:18
    3 марта 2010 г. 11:00
  • Проверки на противоречивость не будет, по крайней мере в этой ситуации.
    Вставки приходят не одновременно, всегда есть первая и вторая. Если они пересекаются по времени, то получается примерно следющее:
    1. Сервер получает первую вставку. Создает транзакцию с уровнем read committed
    2. Блокирует чтение и запись в таблицу (т.к. сейчас в нее будут записаны данные, и их нельзя позволить прочитать до коммита транзакции)
    3. Пишет данные первой вставки
    4. Внезапно приходит вторая вставка. Создается вторая транзакция.
    5. При попытке вставить данные сервер обнаруживает блокировку на запись, и ждет
    6. Первая вставка завершается, первая транзакция коммитается, блокировки снимаются.
    7. Сервер продолжает вторую вставку.
    • Предложено в качестве ответа Nikonorov Evgeniy 3 марта 2010 г. 11:38
    • Помечено в качестве ответа EgoZa 3 марта 2010 г. 12:17
    3 марта 2010 г. 11:06