У меня есть серверное приложение и база данных.Несколько экземпляров сервера могут работать одновременно, но все данные поступают из одной и той же базы данных (на некоторых серверах это postgresql, в других случаях ms sql server).
В моем приложении есть процессэто выполняется, что может занять несколько часов.Мне нужно убедиться, что этот процесс выполняется только по одному.Если один сервер обрабатывает, другой экземпляр сервера не сможет обработать, пока не завершится первый.
Процесс зависит от одной таблицы (назовем ее «ProcessTable»).Что я делаю, прежде чем какой-либо сервер запустит процесс продолжительностью в один час, я устанавливаю логический флаг в ProcessTable, который указывает, что эта запись «заблокирована» и обрабатывается (не все записи в этой таблице обрабатываются / блокируются, поэтому янеобходимо специально отметить каждую запись, которая необходима для процесса).Поэтому, когда следующий экземпляр сервера появляется, когда предыдущий экземпляр все еще обрабатывается, он видит логические флаги и выдает исключение.
Проблема в том, что оба экземпляра сервера могут быть активированы почти одновременно,и когда оба проверяют ProcessTable, возможно, не установлены никакие флаги, но оба сервера фактически находятся в процессе «установки» флагов, но поскольку транзакция еще не зафиксирована ни для одного из процессов, ни один из процессов не увидит блокировку, выполненнуюдругой процесс.Это связано с тем, что сам механизм блокировки может занять несколько секунд, поэтому существует такое окно возможностей, в котором 2 сервера могут обрабатывать одновременно.
Похоже, что мне нужна отдельная записьв моей таблице «Настройки», которая должна хранить логический флаг с именем «LockInProgress».Поэтому, прежде чем даже сервер сможет заблокировать необходимые записи в ProcessTable, он должен сначала убедиться, что у него есть полные права на блокировку, проверив столбец «LockInProgress» в таблице настроек.
Поэтому мой вопросКак я могу запретить двум серверам одновременно изменять этот столбец LockInProgress в таблице настроек ... или я поступаю неправильно?
Обратите внимание, что мне нужно поддерживать оба сервера postgresql и ms sql, поскольку некоторые серверы используют одну базу данных, а некоторые серверы используют другую.
Заранее спасибо ...