Вопрос

Я только что читал о RDBMS, и одним имуществом RDBMS является атомность.Таким образом, если деньги будут отобраны со счета и передаются на другой, либо транзакция произойдет полностью или вообще не.Там нет частичных транзакций.Но как на самом деле обеспечивается?

Запросы SQL для приведенного выше сценария могут выглядеть как обновление (i) accounts установить баланс = баланс - сумма, где AC_NUM = 101 (ii) обновление accounts установить баланс = баланс + сумма ГДЕ ac_num = 102

Что ни в коем случае не обеспечивает атомарность..Так как же это происходит на самом деле?

Это было полезно?

Решение

Если ты это сделаешь

BEGIN TRANSACTION
UPDATE accounts set balance = balance - amount WHERE ac_num = 101
UPDATE accounts set balance = balance + amount WHERE ac_num = 102
COMMIT TRANSACTION

Система базы данных будет записывать примечания о том, что было сделано для изменений на счете 101.А затем, если работа над учетной записью 102 завершится неудачно, СУБД использует эти записи, чтобы отменить работу над учетной записью 101.

Более того, когда он начинает работу с учетной записью 101, он блокирует базу данных, чтобы никто другой не мог прийти и прочитать обновленные, но не зафиксированные данные в учетной записи 101.(Здесь замок — это, по сути, просто пометка где-то «Я здесь работаю, не трогайте».)

Другие советы

Чтобы быть атомарными, транзакции должны:

  • Не позволяйте другим транзакциям мешать строкам, которые они записывают или читают.
  • Убедитесь, что все изменения, внесенные транзакцией, или ни одно из них не будут сохранены в базе данных при фиксации транзакции.

Первый достигается за счет запирание строки, которые транзакция читает или записывает во время своего выполнения.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top