В Oracle SQL почему удаленные (незафиксированные) строки не видны в текущем сеансе, но видны в других сеансах? - PullRequest
1 голос
/ 14 января 2012

Когда выполняется запрос DELETE, откуда именно удаляются данные?Почему данные все еще видны в других сеансах?Каковы фоновые процессы, которые выполняются при запуске запроса DELETE в Oracle SQL (на уровне архитектуры)?

Ответы [ 3 ]

3 голосов
/ 15 января 2012

Помимо обсуждения свойств ACID, на которые ссылается ziesemer , вы должны знать о многоверсионном управлении параллелизмом или MVCC. Если вы хотите узнать «все об этом», подумайте о том, чтобы прочитать Контроль и восстановление параллелизма в системах баз данных от Филиппа А. Бернштейна, Вассоса Хадзилакоса, Натана Гудмана (доступно для скачивания).

В Oracle и других аналогичных СУБД MVCC при запуске транзакции сохраняется отметка времени, которая идентифицирует это время начала (но значение отметки времени не обязательно является простым «секундами со значения эпохи Unix»). Пока эта транзакция выполняется, она не увидит никаких данных, вставленных с отметкой времени после ее начала. Система сохраняет предыдущие версии страниц данных доступными для транзакций, которые еще выполняются. Когда транзакция записывает страницу, она создает новую копию с новой отметкой времени, но эта копия не становится доступной для других транзакций до тех пор, пока не будет принята изменяющая транзакция, и даже тогда она доступна только для транзакций, которые начинаются после фиксации.

3 голосов
/ 14 января 2012

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

Данные все еще видны в другом сеансе в соответствии с указанными выше стандартами.

2 голосов
/ 14 января 2012

строка удаляется для локального сеанса, как только команда введена, но не для других сеансов до COMMIT.

...