2010-04-24 2 views
3

У меня проблема с пониманием согласованности чтения в базе данных (Oracle).Операция транзакции транзакций Oracle?

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

ответ

10

Пункт согласования согласованности заключается в следующем: предположим, что клиент откатывает свои изменения? Или предположите, что эти изменения потерпят неудачу из-за нарушения ограничения или некоторого сбоя системы?

До тех пор, пока клиент не выполнит свои изменения, эти изменения не существуют. Любое решение, которое вы могли бы сделать на основе фантомного чтения или грязного чтения, не имело бы больше действительности, чем описанный вами сценарий. Действительно, они имеют меньшее значение, поскольку изменения являются неполными и, следовательно, непоследовательными. Конкретный пример: если изменения клиента включают внесение депозита и вывод средств, насколько действительным было бы ваше решение, если бы вы просмотрели счет, когда сделали депозит, но еще не сделали вывод?

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

редактировать

Read консистенция достигается за счет использования информации, содержащейся в UNDO табличного (сегменты отката в старой реализации). Когда сеанс считывает данные из таблицы, которая изменяется другим сеансом, Oracle извлекает информацию UNDO, которая была сгенерирована этим вторым сеансом, и заменяет ее на измененные данные в наборе результатов, представленном на первом сеансе.

Если сессия чтения является длинным запросом, она может потерпеть неудачу из-за пресловутого ORA-1555: snapshot too old. Это означает, что степень UNDO, в которой содержится информация, необходимая для сбора согласованного представления, была перезаписана.

Замки не имеют ничего общего с согласованностью чтения. В Oracle записи не блокируют чтение. Цель блокировок состоит в том, чтобы другие процессы не пытались изменить интересующие нас строки.

+0

Хорошо, что я получил вашу точку. Это о том, что произойдет, если транзакция, у которой есть блокировка, не удалась? или что, если менеджер читает данные в реальном времени до завершения транзакции? Кстати, знаете ли вы внутренний механизм согласованности чтения. Заблокированы ли блокировки для обеспечения согласованности чтения? (Я думаю, что блокировки вступают в игру только для предотвращения одновременной транзакции и что блокировки не являются обязательными для согласованности чтения). – user319280

+0

«Это означает, что степень UNDO, в которой содержится информация, необходимая для сборки прочитанного согласованного представления, была перезаписана». - Не могли бы вы лучше объяснить? Вы хотите сказать, что пространство памяти в памяти заполнено, а затем вы видите ошибку ORA-1555? – ROCKY

1

Для систем с большим количеством пользователей, где пользователи могут «удерживать» блокировку в течение длительного времени, обычно используется Optimistic Offline Lock pattern, т.е. использовать версию в инструкции UPDATE ... WHERE.

Вы можете использовать дату, версию id или что-то еще в качестве версии строки. Также может использоваться виртуальный column ORA_ROWSCN, но сначала вам нужно прочитать его.

+1

ORA_ROWSCN не зависит от оптимистической блокировки, см .: http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:2680538100346782134 –

0

Когда запись заблокирована из-за изменений или явного оператора блокировки, запись записывается в заголовок этого блока. Это называется ITL (список заинтересованных транзакций). Когда вы придете, чтобы прочитать этот блок, ваш сеанс видит это и знает, куда идти, чтобы получить прочитанную согласованную копию из сегмента отката.