Я бы посмотрел сначала на то, почему вы хотите это сделать. Обычно приложения работают так, нет проблем с двумя клиентами, делающими вставки одновременно (ну, кроме неправильных подходов в коде).
Также решение будет отличаться в зависимости от сценария. Один из вариантов - иметь очередь сообщений Microsoft (MSMQ) и перемещать вставки из этих служб, поэтому загрузка вложений управляется процессом, который читает форму очереди.
Обновление 1: Я все еще не понимаю, почему вы хотите, чтобы вставки не запускались параллельно (и из того, что я читал в других ответах, которые, как я полагаю, делают другие). Процитирую 2 из ваших комментариев по этому поводу:
Причина, по которой я хочу, это потому, что в случае перенапряжения я потерял только одну транзакцию вместо многих.
Ant другой:
Это потому, что перед введением, есть и другие длинные работы, которые требуют параллельности. Только тогда, когда во время вставки требуется последовательный доступ.
Если я прочитаю только первый, я бы на самом деле подумал, что это причина, по которой они хотят их параллельно. Вы хотите сделать с ними как можно быстрее. Переход последовательных будет фактически увеличить время, чтобы сделать вставки, так что есть больше времени, когда может произойти скачок мощности.
Чтение второго, это заставляет меня думать, что вы, вероятно, больше заботитесь о влиянии этих процессов на параллель, а вставка не попадает в дБ. Это снова означает, что вы хотите сделать это с помощью вставки как можно скорее, поэтому не обязательно делать это последовательно.
Для встроенной поддержки у вас может быть случай для распределенной транзакции, которая также включает в себя файловую систему (мс смотрел на файловую систему, но я не помню, если они когда-либо делали что-то на новой ОС). Распределенные транзакции - это боль, которую нужно настроить (msdtc и доступ к используемым портам).
Хороший путь, за которым я последовал, добавляет больше информации в процесс, чтобы узнать, где он не удалось. Возможно, вы даже не можете запрограммировать процесс автоматического восстановления, но, по крайней мере, вы знаете, что информация наверняка узнает, что что-то пошло не так.
Самый простой способ - это вставка в начале процесса и иметь флаг для сигнала, когда он был завершен. Если это длительный процесс, вы можете захотеть иметь нечто большее, чем статус, который вы обновляете, чтобы иметь возможность сказать, на каком этапе он не прошел. Альтернативой является запись состояния в файловую систему.
В любом случае он скажет вам, что последний шаг, который успешно завершился, а не был ли текущий шаг выполнен или не может быть завершен. Это делает логику повторения немного более сложной, так как вы не можете просто продолжать ее остановку, вам нужно проверить, был ли последний шаг выполнен или не выполнен, и это зависит от каждого шага.
Ps. если это так, трудно сказать из вопроса. Возможно, вы захотите открыть другой вопрос о длительных процессах и/или автоматических попытках.
Зачем вы запускаете сервис при смене файла? Почему бы не позволить службе смотреть каталог с помощью FileSystemWatcher = Если это действительно сервис, он должен выполняться в фоновом режиме и просыпаться, когда что-то происходит. Затем вы можете контролировать параллельные вставки по желанию вашего сердца ... –
Я редактирую вопрос, чтобы сделать его более ясным. – Graviton