
SQL: семейный бюджет без догадок Урок 2 из 4
Транзакции и UPDATE: изменить всё или ничего
Исправляем данные безопасно и моделируем перевод между счетами как одну атомарную операцию. Учимся проверять WHERE через SELECT, использовать ROLLBACK и не путать банковскую операцию с транзакцией базы.
Зачем это нужно
Перевод со счёта на счёт состоит минимум из двух связанных записей. Если списание сохранилось, а зачисление нет, база показывает деньги, которых не существует.
Образ. Транзакция — шлюз с двумя воротами. Либо лодка полностью прошла и ворота закрылись, либо вода и лодка вернулись в исходное состояние.
Сразу целиком
BEGIN IMMEDIATE;
UPDATE transactions
SET note = 'Utilities and rent'
WHERE id = 2;
SELECT changes() AS changed_rows;
COMMIT;
Разбор
Свойства транзакции кратко называют ACID: атомарность, согласованность, изоляция и долговечность. Реальные гарантии и уровни изоляции зависят от СУБД; SQLite сериализует записи и имеет собственную модель блокировок.
Перед UPDATE или DELETE запустите SELECT id ... с тем же WHERE. После изменения проверьте число строк. Условие без ключа может затронуть весь месяц или всю таблицу.
COMMIT закрепляет изменения. ROLLBACK отменяет незавершённую транзакцию. SAVEPOINT позволяет откатить часть многошаговой работы.
Перевод между собственными счетами лучше моделировать отдельной сущностью или двумя проводками с общим transfer_id; не записывайте его как расход, иначе семейные траты будут завышены.
Карта урока
Скажите своими словами
- Что означает атомарность?
- Как проверить
WHEREдо изменения? - Почему перевод между своими счетами не является расходом семьи?
Задание
В транзакции измените лимит транспорта на 40 000 ₸. До COMMIT прочитайте новое значение, затем выполните ROLLBACK и убедитесь, что вернулось старое.
Куда это встанет в проекте
Все связанные изменения бюджета выполняются атомарно; ошибку можно отменить до фиксации.
Ответы
Показать ответы
BEGIN;
UPDATE categories SET monthly_limit_tiyn=4000000 WHERE name='Transport';
SELECT monthly_limit_tiyn FROM categories WHERE name='Transport';
ROLLBACK;
SELECT monthly_limit_tiyn FROM categories WHERE name='Transport';
Источники
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.