Сценарий, в котором следует использовать Read commit или Serializable в качестве уровня изоляции? - PullRequest
3 голосов
/ 12 октября 2011

Я пытаюсь выяснить, какой уровень изоляции (среди сериализуемых и зафиксированных при чтении) лучше в каких сценариях ... По ссылке http://download.oracle.com/docs/cd/B14117_01/server.101/b10743/consist.htm#i17894, Я шел по теме Выбор уровня изоляции ,Я получил некоторую ясность и некоторые вопросы, основанные на некоторых утверждениях в статье.

Satement : - Чтение фиксированной изоляции может обеспечить значительно больший параллелизм с несколько повышенным риском противоречивых результатов из-за фантомов инеповторяемые операции чтения для некоторых транзакций.

Вопрос1: - Как зафиксированная изоляция обеспечивает больше параллелизма, чем сериализуемого? Согласно моему пониманию сериализуемые транзакции также не ограничивают параллельные транзакции.

Заявление: - Все запросы в сериализуемой транзакции Oracle видят базу данных как единый момент времени

Вопрос: - Я думаю, что они имеют в виду здесь, когдаСериализуемая транзакция начинается, скажем, в момент времени t1, тогда все данные будут представлены дляm Состояние базы данных, которое было в момент времени t1. Верно? Не уверен, когда мы вызываем, транзакция фактически начинается. Это когда мы получаем соединение или когда запускается первый запрос?

Заявление: - Сериализуемая изоляция Oracle подходит для сред, где существует относительно низкая вероятность того, чтодве параллельные транзакции изменят одни и те же строки, а долгосрочные транзакции в основном предназначены только для чтения

Вопрос: - Скажем, две транзакции tran1 и tran2 начинаются в момент времени t1.Если tran1 обновляет строку row1 в момент времени t2, а позже в момент времени t3 выборки tran2 будет ли та же строка tran2, будет ли обновленная строка сделана с помощью tran1?(Я думаю, нет, потому что tran2 будет извлекать состояние данных, которые присутствовали в момент времени t1. Верно? )

Заявление: - Кодирование сериализуемых транзакций требует дополнительной работыразработчик приложения должен проверить на наличие ошибки «Cannot serialize access», отменить и повторить транзакцию.

Вопрос: - Не уверен, когда разработчик получит ошибку «Cannot serialize access». Получим ли мы ту же ошибку в следующем сценарии

Скажем, две транзакции tran1 и tran2 начинаются в момент времени t1.Если tran1 обновляет строку1 в момент времени t2, а позже в момент времени t3 tran2 обновляет ту же строку1.В этом случае будет выдано сообщение об ошибке «Не удается сериализовать доступ»? Если да, поддерживает ли oracle версию внутренне в случае сериализуемых транзакций, чтобы узнать, что строка была обновлена ​​пользователем?

1 Ответ

2 голосов
/ 12 октября 2011

Если вы хотите увидеть зафиксированные данные, выберите «прочитано зафиксировано».Каждый запрос может видеть разные зафиксированные данные.

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

Оба имеют ограничения.Выберите необходимый уровень изоляции.Не выбирайте уровень изоляции, который делает больше, чем вам нужно.

...