Обеспечение атомности sql - PullRequest
5 голосов
/ 28 марта 2009

Я только что читал о RDBMS, и одно свойство СУБД атомарность. Итак, если деньги сняты со счета и переведены на другое, либо сделка произойдет полностью или нет совсем. Там нет частичного сделки. Но как на самом деле обеспечивается

запросов SQL для вышеуказанного сценария может выглядеть как (i) ОБНОВЛЕНИЕ accounts установить баланс = баланс - сумма ГДЕ ac_num = 101 (ii) ОБНОВЛЕНИЕ accounts установить баланс = баланс + сумма ГДЕ ac_num = 102

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

Ответы [ 2 ]

5 голосов
/ 28 марта 2009

Если вы делаете

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. (Блокировка здесь - это просто записка где-то: «Я здесь работаю, не трогай».)

2 голосов
/ 28 марта 2009

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

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

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

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

...