Является ли блокировка EXCLUSIVE единственным способом предотвратить одновременную вставку нескольких сеансов? - PullRequest
0 голосов
/ 17 июля 2011

Я думаю о реализации очереди в базе данных Oracle, в основном используя таблицу в качестве очереди, и пытаюсь решить, как предотвратить одновременную вставку нескольких таблиц в таблицу и испортить порядок.

Делает ли LOCK TABLE mytable IN EXCLUSIVE MODE единственный способ предотвратить вставку нескольких сессий в таблицу?

Edit:

«Очередь» здесь, вероятно, не правильный термин. Больше списка, в котором важен относительный порядок между элементами. Я думаю о чем-то вроде порядка Java ArrayList .

Ответы [ 2 ]

7 голосов
/ 17 июля 2011

Вы уверены, что вам нужно создать собственную очередь? Oracle предоставляет встроенную очередь (называемую Oracle Advanced Queuing) . Это, безусловно, будет лучшим вариантом, чем самостоятельная реализация того же самого.

Если вы реализуете очередь самостоятельно, зачем вам нужно предотвращать одновременные вставки? В каком порядке вы обеспокоены тем, чтобы быть "испорченным"? Предполагая, что вы используете объект последовательности Oracle для заполнения первичного ключа, я не вижу причин, по которым вам бы пришлось предотвращать одновременные обновления.

1 голос
/ 19 июля 2011

Мне совершенно неясно, какую проблему вы пытаетесь избежать.

Явная блокировка обеспечивает сериализацию, но, по-видимому, не обеспечивает какого-либо значимого, детерминированного порядка вставки.Если две сессии пытались вставить «одновременно», то какая из них получает блокировку первой, по существу, случайна.Тот же эффект вы получите без явной блокировки, если у таблицы есть первичный ключ, так как несколько вставок должны будут сериализоваться для этого, чтобы обеспечить уникальность.Но даже без этого одна сессия заканчивалась тем, что вставляла (или, если точнее, вставляла свою вставку) раньше другой.

Похоже, у вас есть какое-то чувство порядка, в котором элементы должны находиться независимопорядка, в котором они вставлены.Без подробностей моя реакция на это состоит в том, что в таблице должен быть столбец с указанием порядка, и читатели таблицы должны использовать это для правильной сортировки записей.Напомним, что таблицы базы данных не имеют внутреннего порядка;просто потому, что одна строка вставляется перед другой, не означает, что они хранятся в этом порядке или возвращаются к запросам в этом порядке.

...