Можете ли вы заблокировать последовательность Oracle? - PullRequest
2 голосов
/ 09 апреля 2011

Можно ли заблокировать последовательность Oracle, чтобы любой сеанс, пытающийся использовать nextval, блокировался до тех пор, пока я не закончу со своим сценарием?

Я объясню, что я делаю, если есть другаяпуть.Я готовлю схему для двунаправленной репликации с потоками.Я хочу убедиться, что все последовательности первичных ключей производят уникальные значения.Я делаю это, увеличивая последовательность на 1, пока последняя цифра не станет 1, а затем изменим приращение на 100. На другом сервере я делаю то же самое, пока последняя цифра не станет 2. Таким образом, сервер 1 всегда создает первичные ключи XXXXX01 и сервер 2.XXXXX02.

Проблема в том, что это база данных 24x7, и я не могу остановить всю активность, пока настраиваю последовательности.Если я смогу получить эксклюзивную блокировку на короткое время, я могу сделать это надежно.

Ответы [ 4 ]

3 голосов
/ 09 апреля 2011

Самое простое из возможных решений (на мой взгляд) - использовать нечетные числа для сервера 1 и четные числа для сервера 2. Это также устраняет необходимость сериализации.

create sequence server1_seq increment by 2 start with 1;
create sequence server2_seq increment by 2 start with 2;

Это приведет к ряду значений, таких как:

Server 1  Server 2
--------  --------
   1          2
   3          4
   5          6 
   7          8
   9         10

Это решение может быть дополнительно расширено для обработки более двух серверов за счет увеличения приращений (и разных начальных значений для каждого сервера).

Сказав это, НЕ используйте этот подход, если вы хотите со временем добавить больше серверов. Вам придется перевести все базы данных в автономный режим и восстановить таблицы с нуля.

3 голосов
/ 09 апреля 2011

Мне лично нравится идея использования отдельных непересекающихся последовательностей, как предложил Роннис.

Другой вариант, который следует рассмотреть, - это составной первичный ключ.

  1. Если выЕсли вы можете добавить столбец в модель данных, вы добавляете идентификатор, который устанавливается по-разному в зависимости от того, на каком сервере запущен процесс.

  2. Если вы не можете добавить столбец, вывместо этого можно изменить тип данных столбца на VARCHAR2 и установить его как составной;например, на сервере 1 вы должны объединить '1-' со значением последовательности, например, '1-103450', следовательно, не будет конфликтовать с '2-103450', сгенерированным на сервере 2.

В любом случае, это не страдает от каких-либо проблем с добавлением дополнительных серверов в будущем.

1 голос
/ 11 апреля 2011

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

REVOKE SELECT ON mysequence FROM username;

Примечание: это не блокировка как таковая; вместо ожидания они получат ошибку Oracle (думаю, неверный идентификатор).

1 голос
/ 09 апреля 2011

Нет, вы не можете заблокировать последовательность. Вы можете попытаться воссоздать последовательности в необходимом состоянии. Это ненадолго вызовет проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...