Избегайте грязных / фантомных чтений при выборе из базы данных

У меня есть две таблицы A и B.

Мои транзакции такие:

  • Читать -> читать из таблицы А
  • Написать -> написать в таблице B, написать в таблице A

Я хочу избежать грязного / фантомного чтения, так как у меня есть несколько узлов, делающих запрос к одной и той же базе данных.

Вот пример:

  1. Транзакция 1 - обновление происходит в таблице B
  2. Транзакция 2 - Чтение происходит в таблице A
  3. Транзакция 1 - обновление происходит в таблице A
  4. Транзакция 2 - Завершено
  5. Транзакция 1 - Откат

Теперь клиент Transaction 2 имеет грязные данные. Как мне этого избежать?

1 ответ

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

Предполагая, что ваша база данных зарегистрирована - здесь не имеет значения, является ли она буферизованным журналом или небуферизованным журналом или (в основном) базой данных MODE ANSI - тогда, если вы не установите изоляцию DIRTY READ, вы работаете, по крайней мере, с изоляцией COMMITTED READ (это будет Уровень REPEATABLE READ в Informix, уровень SERIALIZABLE стандартного SQL, если база данных MODE ANSI).

Если вы хотите убедиться, что строки данных не изменились после того, как транзакция их прочитала, вам нужно работать с более высокой изоляцией - REPEATABLE READ. (Подробнее см. SET ISOLATION в руководстве. (Остерегайтесь номенклатуры для SET TRANSACTION; есть раздел руководства о сравнении SET ISOLATION и SET TRANSACTION и связанных с ним разделов.) Недостаток использования SET ISOLATION для повторного чтения (или SET Уровень изоляции транзакции (SERIALIZABLE) заключается в том, что необходимые дополнительные блокировки уменьшают параллелизм, но дают вам наилучшие гарантии о состоянии базы данных.

Другие вопросы по тегам