Могу ли я заменить точки сохранения для запуска новых транзакций в Oracle?

StackOverflow https://stackoverflow.com/questions/1514526

Вопрос

Прямо сейчас процесс, который мы используем для вставки наборов записей, выглядит примерно так:

(и обратите внимание, что "набор записей" означает что-то вроде записи пользователя вместе с его адресами, номерами телефонов или любыми другими объединенными таблицами).

  1. Начните транзакцию.
  2. Вставьте набор связанных записей.
  3. Зафиксируйте, если все прошло успешно, в противном случае выполните откат.
  4. Вернитесь к шагу 1 для следующего набора записей.

Должны ли мы делать что-то более похожее на это?

  1. Запустите транзакцию в начале скрипта
  2. Создайте точку сохранения для каждого набора записей.
  3. Вставьте набор связанных записей.
  4. Откатитесь к точке сохранения, если произошла ошибка, продолжайте, если все прошло успешно.
  5. Зафиксируйте транзакцию в начале скрипта.

После возникновения некоторых проблем с ORA-01555 и прочтения нескольких статей Ask Tom (например этот), я подумываю о том, чтобы опробовать второй процесс.Конечно, как указывает Том, начало новой транзакции - это то, что должно определяться потребностями бизнеса.Стоит ли опробовать второй процесс, или это плохая идея?

Это было полезно?

Решение

Транзакция должна быть значимой Единицей Работы.Но то, что составляет Единицу Работы, зависит от контекста.В системе OLTP единицей работы был бы один Человек вместе с информацией об их адресе и т.д.Но это звучит так, как будто вы реализуете какую-то форму пакетной обработки, которая загружает множество пользователей.

Если у вас возникли проблемы с ORA-1555, это почти наверняка связано с тем, что у вас долго выполняется запрос, предоставляющий данные, которые обновляются другими транзакциями.Фиксация внутри вашего цикла способствует циклическому использованию сегментов ОТМЕНЫ, и поэтому будет иметь тенденцию увеличивать вероятность того, что сегменты, на которые вы полагаетесь для обеспечения согласованности чтения, будут использованы повторно.Так что не делать этого, вероятно, хорошая идея.

Является ли использование точек сохранения решением - это другой вопрос.Я не уверен, какое преимущество это дало бы вам в вашей ситуации.Поскольку вы работаете с Oracle10g, возможно, вам следует рассмотреть возможность использования bulk Ведение журнала ошибок DML вместо этого.

В качестве альтернативы вы можете переписать управляющий запрос таким образом, чтобы он работал с меньшими фрагментами данных.Не зная больше о специфике вашего процесса, я не могу дать конкретный совет.Но в целом, вместо того, чтобы открывать один курсор для 10000 записей, возможно, было бы лучше открывать его двадцать раз по 500 строк за раз.Другая вещь, которую следует учитывать, - это то, можно ли сделать процесс вставки более эффективным, скажем, с помощью массового сбора и FORALL .

Другие советы

Кое-какие мысли...

  1. Мне кажется, одним из пунктов ссылки asktom было определить размер вашего отката / отмены соответствующим образом, чтобы избежать 1555-х годов.Есть ли какая-то причина, по которой это невозможно?Как он указывает, гораздо дешевле купить диск, чем писать / поддерживать код для обхода ограничений отката (хотя мне пришлось перепроверить после прочтения ценника в 250 долларов за диск емкостью 36 Гб - этот поток начался в 2002 году!Хорошая иллюстрация Закона Мура!)
  2. Эта ссылка (Бурлесон) показывает одну из возможных проблем с точками сохранения.
  3. Соответствует ли ваша транзакция фактическим шагам 2,3 и 5 вашего второго сценария?Если да, то это то, что я бы сделал - зафиксировал каждую транзакцию.Мне немного кажется, что сценарий 1 - это набор транзакций, объединенных в одну?
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top