Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
COMMIT в SQL
Определение
COMMIT — это SQL команда, которая окончательно сохраняет все изменения, внесённые в базу данных в текущей транзакции. После выполнения COMMIT все операции (INSERT, UPDATE, DELETE) становятся постоянными и недоступны для отката.
Основная концепция: Транзакции
Транзакция — это логическая единица работы с БД, которая состоит из одной или нескольких SQL операций:
BEGIN TRANSACTION;
INSERT INTO users (name, email) VALUES ("John", "john@example.com");
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
DELETE FROM logs WHERE date < "2026-01-01";
COMMIT;
Как работает COMMIT
- Начало: транзакция начинается (явно или неявно)
- Операции: выполняются SQL команды
- COMMIT: все изменения записываются в БД окончательно
- Завершение: транзакция закрывается
COMMIT vs ROLLBACK
Два основных способа завершить транзакцию:
BEGIN;
UPDATE users SET status = "active" WHERE id = 1;
INSERT INTO audit_log (action) VALUES ("User activated");
COMMIT;
BEGIN;
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;
ROLLBACK;
Реальный пример: Переводы денег
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
ROLLBACK;
Свойства транзакций (ACID)
COMMIT гарантирует свойства ACID:
- Atomicity (Атомарность) — либо все операции выполнены, либо ни одна
- Consistency (Консистентность) — БД переходит из одного согласованного состояния в другое
- Isolation (Изолированность) — изменения видны другим только после COMMIT
- Durability (Долговечность) — после COMMIT данные сохранены навсегда
COMMIT в разных БД
PostgreSQL
BEGIN;
INSERT INTO products (name, price) VALUES ("Laptop", 999.99);
COMMIT;
MySQL
START TRANSACTION;
UPDATE inventory SET quantity = quantity - 1 WHERE id = 5;
COMMIT;
SQLite
BEGIN;
DELETE FROM temp_data WHERE processed = false;
COMMIT;
Auto-commit режим
В большинстве БД по умолчанию auto-commit включён:
INSERT INTO users VALUES (1, "John");
UPDATE users SET name = "Jane";
SET autocommit = OFF;
SET AUTOCOMMIT = FALSE;
Работа с COMMIT в Python
import sqlite3
conn = sqlite3.connect("database.db")
cursor = conn.cursor()
try:
cursor.execute("INSERT INTO users (name) VALUES (?)", ("John",))
cursor.execute("INSERT INTO audit_log (action) VALUES (?)", ("User added",))
conn.commit()
print("Изменения сохранены")
except Exception as e:
conn.rollback()
print(f"Ошибка: {e}")
finally:
conn.close()
С использованием контекстного менеджера
import sqlite3
with sqlite3.connect("database.db") as conn:
cursor = conn.cursor()
try:
cursor.execute("INSERT INTO users (name) VALUES (?)", ("Alice",))
conn.commit()
except Exception:
conn.rollback()
Уровни изоляции транзакций
Когда несколько транзакций работают параллельно, уровень изоляции влияет на видимость COMMIT изменений:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Важные моменты
- COMMIT необходим: без COMMIT изменения могут быть потеряны
- Размер транзакции: очень большие транзакции блокируют ресурсы
- Deadlock: два COMMIT могут конфликтовать, вызывая deadlock
- Неявный COMMIT: некоторые операции (CREATE, DROP, ALTER) вызывают автоматический COMMIT
Итоговая схема
COMMIT — это команда SQL для окончательного сохранения всех изменений в текущей транзакции. Без COMMIT изменения остаются в памяти и могут быть отменены. COMMIT гарантирует atomicity и durability — основу надёжной работы с БД.