В настоящее время у меня есть INSERT TRIGGER, который в Oracle 10g выполняет пользовательскую функцию, генерирующую необычный буквенно-цифровой код, который используется как часть вставки.
Мне действительно нужно убедиться, что функция (или даже триггер) является поточно-ориентированной, поэтому, если два пользователя активируют триггер одновременно, функция, используемая в триггере, НЕ возвращает один и тот же код для обоих пользователей.
Поток в триггере выглядит следующим образом:
START
- определить, нужно ли нам продолжать на основе бизнес-логики
- запустить пользовательскую функцию, чтобы получить новый код
- использовать возвращенный код в качестве вставки в другую таблицу
END
Основная проблема заключается в том, что во время выполнения шага 2 отдельный поток запускает триггер, который также попадает на шаг 2, и возвращает тот же код, что и первый поток. (Я понимаю, что это очень трудная ситуация, но мы должны справиться с этим).
Я подумал о двух основных способах сделать это:
На данный момент лучший способ, о котором я думал, это заблокировать таблицу, используемую в триггере, в «эксклюзивном режиме» в самом начале триггера, а не указывает атрибут NOWAIT замок. Таким образом, каждая последующая активация триггера будет «останавливаться и ждать», пока блокировка не станет доступной, и, следовательно, ждать, пока другие потоки завершат работу с триггером.
Я бы хотел заблокировать таблицу при любом запрещении чтения таблицы, но я мог бы выяснить, как это сделать в Oracle.
Моя идея не идеальна, но она должна работать, однако я хотел бы услышать от любого, кто может иметь лучшие идеи, что это!
Большое спасибо за предоставленную помощь.
Ура,
Mark