/* Query 1 */
SELECT age FROM users WHERE id = 1;
/* will read 20 */
Transaction (рус. транзакция, от лат. transactio — соглашение, договор)
Минимальная логически осмысленная операция
Имеющая смысл
Может быть совершена только полностью или не совершена вовсе
Transaction processing - процесс обработки транзакций
Transaction processing занимаются online transaction processing (OLTP, транзакционные системы)
Чаще всего термины Transaction и Transaction processing относительно database
Стоит помнить что термины Transaction и Transaction processing НЕ ТОЛЬКО о database
Transactions (последовательные транзакции (или обычные))
Обычно одна целостная система, расположенная на одном host (компьютере)
Distributed transactions (параллельные и распределенные транзакции)
Обычно распределенная система, расположенная на нескольких hosts (компьютерах)
ACID описывает требования к транзакционной системе
ACID обеспечивает наиболее надёжную и предсказуемую работу транзакционной системе
Требования ACID были в основном сформулированы в конце 70-х годов Джимом Греем.
A - Atomicity (Атомарность)
C - Consistency (Согласованность)
I - Isolation (Изолированность)
D - Durability (Прочность)
Никакая транзакция не будет зафиксирована в системе частично
т.е. выполняется все или ничего
Каждая успешная транзакция по определению фиксирует только допустимые результаты
т.е. транзакция обеспечивает перевод БД из одного зафиксированного состояния в другое
Во время выполнения транзакции параллельные транзакции не должны оказывать влияния на её результат
т.е. транзакции отделены одна от другой и "не видят" результата выполнения друг друга до полного завершения
Если пользователь получил подтверждение от системы, что транзакция выполнена, он может быть уверен, что сделанные им изменения не будут отменены из-за какого-либо сбоя.
т.е. результаты успешного выполнения транзакции должны сохраняться, даже если в следующий момент в системе происходят какие-либо сбои
Dirty reads («Грязное» чтение)
Non-repeatable reads (Неповторяющееся чтение)
Phantom reads (Чтение «фантомов»)
/* Query 1 */
SELECT age FROM users WHERE id = 1;
/* will read 20 */
/* Query 2 */
UPDATE users SET age = 21 WHERE id = 1;
/* No commit here */
/* Query 1 */
SELECT age FROM users WHERE id = 1;
/* will read 21 */
ROLLBACK; /* lock-based DIRTY READ */
/* Query 1 */
SELECT * FROM users WHERE id = 1;
/* Query 2 */
UPDATE users SET age = 21 WHERE id = 1;
COMMIT; /* in multiversion concurrency
control, or lock-based READ COMMITTED */
/* Query 1 */
SELECT * FROM users WHERE id = 1;
COMMIT; /* lock-based REPEATABLE READ */
ROLLBACK; /* lock-based DIRTY READ */
/* Query 1 */
SELECT * FROM users
WHERE age BETWEEN 10 AND 30;
/* Query 2 */
INSERT INTO users(id, name, age) VALUES (3, 'Bob', 27);
COMMIT;
/* Query 1 */
SELECT * FROM users
WHERE age BETWEEN 10 AND 30;
COMMIT;
Read Uncommitted (чтение незафиксированных данных)
Read Committed (чтение фиксированных данных)
Repeatable Read (повторяющееся чтение)
Serializable (упорядочиваемость)
Dirty reads | Lost updates[inconsistent] | Non-repeatable reads | Phantoms | |
---|---|---|---|---|
Read Uncommitted | + | + | + | + |
Read Committed | - | + | + | + |
Repeatable Read | - | - | - | + |
Serializable | - | - | - | - |