насколько я понял нужна целостность уникального по ключу процесса, который может быть запущен на нескольких клиентах, при этом если по ключу процесс выполнен, то не запускать процесс на другом клиенте. Тогда:
1. проверять дубликат до запуска процесса - а где-же еще
2. первый клиент может не завершить транзакцию, тогда отказ второго клиента от процесса - ошибка - то есть надо подождать разрешения ситуации
3. нужен некий семафор реальный или виртуальный - имеет статусы - выполняется, завершен - это и есть информация о том, что происходит
алгоритм вырисовывается такой - ключ - уникальный индекс
1. пока чужой семафор есть и статус = выполняется и время < тайм аута - ждем чем все кончится
2 если чужой семафор - завершено - выход
3. если нет чужого семафора - создать свой = выполняется
4. процесс до
5. лог
6. процесс после
7. семафор = завершено
технически наиболее близкое решение - это код выделения номеров по номерным сериям - 3 пункт это и есть выделить номер (ключ), только я имею ввиду не создавать номерную серию, а взять блоки кода по транзакциям - при разноске, например, документов сам процесс разноски еще не закоммичен, а вот номер уже использован и закоммичен!!! и другие клиенты об этом знают, там же есть моменты на предмет разрулить ситуацию, когда два клиента почти одновременно выполнят 3 пункт. Если 6 пункт не достигнут - надо в catch сбросить свой семафор.
семафором можно сделать саму таблицу логов - добавить статус
или - ADOConnection - читать незакомиченные (установить в команде уровень изоляции) записи лога (семафоры) другого клиента - а что?! здесь нет минуса первого варианта, а именно - если выключить комп на пункте 4, то .... семафор придеться чистить ручками или ваять нечто.
по любому главное - проверять процесс на запуск другим клиентом и ждать чем все там завершиться - придеться!
Последний раз редактировалось titov; 25.08.2010 в 17:06.
|