Обеспечение атомности sql

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

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

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

2 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам