#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
Предлагаю создавать временную таблицу в процедуре.
Комментариев нет:
Отправить комментарий