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