Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Предотвращение конфликтов при создании и удалении таблицы в SQL Server

#c_sharp #sql #sql_server


Есть приложение на C# которое создает таблицу бд, заполняет ее необходимыми значениями,
выгружает результат в xml, а затем удаляет таблицу созданную на первом шаге. Все работает
через SqlCommand, запросы берутся из файла. Так как выгружается большой объем данных,
то возможна ситуация когда будут запущены два экземпляра программы и например одна
программа сработает быстрее и удалит таблицу. Как можно избежать данных вариантов?
    


Ответы

Ответ 1



SQL Server не умеет выполнять запросы DDL полностью в транзакциях. Так умеет Postgres, например. Так или иначе, так делать не надо. Таблица в базе данных — это постоянное хранилище, а не временное. Если вы постоянно создаёте и уничтожаете постоянное хранилище, с архитектурой приложения что-то нет так. Удаление таблицы до того, как один процесс закончил выгрузку данных — это меньшая из ваших проблем. Что будет, если второму процессу достанется смесь данных, загруженных им и соседним процессом? На выходе будет мусор. Вы можете добавить в вашу таблицу поле SessionId, чтобы каждый экземпляр приложения работал со своей частью таблицы. Вы можете разграничивать доступ к базе данных на уровне операционной системы, чтобы базу одновременно не изменяло два процесса. Если всё, что вам надо — это обработать данные с помощью SQL, то в зависимости от объёмов можете или размещать данные в памяти и вообще не прикасаться к SQL, или воспользоваться файловыми базами данных типа SQL Compact, или использовать что-то ещё гораздо легковеснее, чем SQL Server.

Ответ 2



Зачем создавать таблицу только чтобы потом удалить ее? Судя по описанию, после работы программы можно удалять не просто таблицу - а всю БД. В таком случае подойдет монопольный режим работы с БД. Еще вариант - при запуске генерировать уникальное имя таблицы. Разные экземпляры программы будут работать с разными таблицами. Ну и банальных транзакций никто не отменял, хоть их и не рекомендуют использовать для больших объемов данных. UPD: А, так вам нужны дополнительные таблицы в сложных выборках? Посмотрите справочник по T-SQL (Transact-SQL), особенно оператор DECLARE. Этот оператор позволяет создать, в том числе, временную таблицу, которая будет видна только в рамках некоторого пакета запросов. Ничего не помешает выполнять два пакета запросов одновременно - у каждого пакета будет своя таблица. Такую таблицу даже не нужно удалять - она удалится автоматически по окончанию пакета.

Ответ 3



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

Ответ 4



Предлагаю создавать временную таблицу в процедуре.

Комментариев нет:

Отправить комментарий