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