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