У меня есть журнал базы данных, где некоторые транзакции выигрывают (они фиксируются до сбоя), а некоторые проигрывают (еще не зафиксированы). В классе мы узнали, что действия проигравших должны быть отменены задом наперед.
Есть ли причина делать это задом наперед? Может ли кто-нибудь привести простой пример журнала, в котором прямая отмена дала бы неправильные результаты?
concurrency
databases
prjctdth
источник
источник
Ответы:
Оригинальные транзакции:
Вперед отменить:
источник
Чтобы добавить к ответу DylanSp, попытка обновить поле в несуществующей записи не удастся, но результатом все равно будет ожидаемый результат: запись r не существует.
Однако рассмотрим ситуацию, когда удаление записи фактически завершится неудачей:
Предположим, что нереально, что каждая OrderLine должна быть связана с Order.
Теперь откат транзакции, начиная с удаления ордера, не удастся, потому что это нарушит наше бизнес-правило.
Так после
Мы можем получить существующий Заказ (без Линии Заказа).
Конечно, в этом случае мы могли бы использовать каскадное удаление, но это означало бы, что шаг 2 завершится неудачей (без последствий). Хуже того, это может быть нежелательным для реализации каскадного удаления заказов.
источник
Пойдем по аналогии: скажем, вы идете на ужин.
Тогда вам позвонят. Ужин планы отменены.
Там что-то идет не так. Вы можете споткнуться и пораниться. Или, более вероятно, вы поймете, что некоторые действия нельзя отменить, пока последующие действия не будут отменены первыми.
Отмена последнего действия, которое вы делали, возвращает вас туда, где вы были, когда произошел следующий шаг. Затем вы отменяете этот шаг и повторяете, двигаясь назад, пока ничего не останется. С другой стороны, отмена первого шага может быть невозможна, учитывая состояния, следующие за последующими шагами.
говоря математически: действия могут не переключаться, поэтому всякий раз, когда имеет значение, какой шаг вы делаете первым или вторым, будет иметь значение порядок, в котором вы отменяете шаги.
источник
Это правильно, потому что транзакции строятся друг на друге, и результат транзакции очень сильно зависит от ситуации до ее совершения.
Давайте посмотрим на финансовые транзакции:
(в начале, до того, как сделка
a
должна мне 100 долларов США)a
должен мне 100 долларов (сейчас общая задолженность 200)a
получает 10% скидку на то, что он мне должен. (сейчас общая задолженность 180)Допустим, я хочу отменить две транзакции.
Если мы отменим первую первую, мы получим:
Это неправильно, нам нужно вернуть долг в 100. Это будет правильно, если мы отменим транзакции в обратном порядке.
источник
Предположим, что существует таблица T только с одним столбцом.
Предположим, что «журнал отмены» - это файл базы данных, содержащий незафиксированные транзакции, и что «журнал отмены» - это файл базы данных, содержащий как незафиксированные, так и зафиксированные транзакции, которые еще не были применены к файлам данных.
At 8:00 A.M., Transaction 100 inserts rows with values 101, 102 and 103 into table T. At 8:10 A.M., Transaction 100 is committed and the commit for transaction 100 completes. At 8:15 A.M., Transaction 200 updates row 101 to 201, 102 to 202 and 103 to 203. At 8:20 A.M., Transaction 200 has not been committed and remains in the undo log of the database. At 8:25 A.M., Transaction 300 increments each row by 50, changing row 201 to 251, 202 to 252, and 203 to 253. At 8:30 A.M., Transaction 300 has not been committed and remains in the undo log of the database. At 8:35 A.M., The instance providing access to the database crashes.
At 8:40 A.M., The instance is restarted, and the database files are opened as the instance is started:
At 8:41 A.M., The redo log has been applied, and the T table contains values 251, 252 and 253 in the instance memory.
At 8:42 A.M., The undo log is applied in the reverse order: Uncommitted transaction 300 is undone, and Uncommitted transaction 200 is undone.
Почему ОБА совершенные и незафиксированные транзакции записываются в файл журнала повторов? Причина этого заключается в обеспечении восстановления на определенный момент времени.
Это означает, что содержимое файла «redo log» НЕ соответствует транзакциям. По этой причине всякий раз, когда журнал повторов используется для применения подтвержденных транзакций к файлам данных, «Журнал отмен» ДОЛЖЕН также использоваться для отката незафиксированных транзакций.
Почему транзакции в «журнале отмены» откатываются в обратном порядке? Транзакция 300 добавила 50 к существующему значению каждого столбца каждой строки. Следовательно, если транзакция 200 откатывается первой, значения изменятся с 251, 252 и 253 на 201, 202 и 203. Если транзакция 300 затем откатится последней, значения будут 151, 152 и 153 - которые не совпадают. исходные совершенные ценности.
ССЫЛКИ:
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1670195800346464273
источник
Это по сути не правда. Откат может просто повторно применить блоки, которые были кэшированы в журнале отмены, так что конечное состояние совпадает с начальным состоянием. Поскольку журнал был записан в порядке пересылки, мой откат также был применен в порядке пересылки. Порядок не имеет значения, потому что откат будет повторяться до тех пор, пока файл журнала не будет помечен как исчерпанный.
источник