Транзакции и блокировки в MySql. Теория и практика

Post on 01-Jun-2015

712 views 16 download

Tags:

Transcript of Транзакции и блокировки в MySql. Теория и практика

Транзакциии блокировки

в MySQL

Теория и практика

Table of Contents

1. Теория. Что такое транзакции в СУБД2. Требования ACID3. Проблемы параллельного выполнения транзакций4. Уровни изоляции транзакций5. Механизмы реализации изоляции транзакций6. InnoDB

a. Виды блокировокb. Многоверсионостьc. Пользовательские блокировкиd. Предотвращение фантомовe. Причины возникновения взаимоблокировокf. Предотвращение взаимоблокировок

Транзакция

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

Пример транзакции: заказ товара на сайте

{BEGIN}1. Найти товар, проверить его наличие и получить цену2. Получить данные о покупателе и его баланс3. Добавить товар в список оплаченных покупок4. Уменьшить баланс пользователя5. Уменьшить количество товара на складе

{COMMIT}

Требования ACID

1. Атомарность (Atomicity) - все входящие в транзакцию операции выполняются нераздельно, т.е. будут либо выполнены все операции, либо не выполнено ни одной. “Все или ничего”.

Требования ACID

1. Атомарность (Atomicity) - все входящие в транзакцию операции выполняются нераздельно, т.е. будут либо выполнены все операции, либо не выполнено ни одной. “Все или ничего”.

2. Согласованность (Consistency) - транзакция, фиксирующая результаты, должна сохранять согласованность данных в базе.

Требования ACID

1. Атомарность (Atomicity) - все входящие в транзакцию операции выполняются нераздельно, т.е. будут либо выполнены все операции, либо не выполнено ни одной. “Все или ничего”.

2. Согласованность (Consistency) - транзакция, фиксирующая результаты, должна сохранять согласованность данных в базе.

3. Изоляция (Isolation) - во время выполнения транзакции параллельные транзакции не должны оказывать влияние на её результат. Другие процессы не должны видеть данные в промежуточном состоянии.

Требования ACID

1. Атомарность (Atomicity) - все входящие в транзакцию операции выполняются нераздельно, т.е. будут либо выполнены все операции, либо не выполнено ни одной. “Все или ничего”.

2. Согласованность (Consistency) - транзакция, фиксирующая результаты, должна сохранять согласованность данных в базе.

3. Изоляция (Isolation) - во время выполнения транзакции параллельные транзакции не должны оказывать влияние на её результат. Другие процессы не должны видеть данные в промежуточном состоянии.

4. Надежность (Durability) - после фиксации изменений, сделанных успешной транзакцией, никакое внешнее событие не должно привести к потере этих изменений.

Как обеспечить требования ACID в реальных СУБД?

Как обеспечить требования ACID в реальных СУБД?

Проблемы параллельного выполнения транзакций

Потерянное обновление (lost update) - при одновременном изменении одного блока данных разными транзакциями, одно из изменений теряется.

balance = 100

balance = 80 или 90

Транзакция 1 Транзакция 2

UPDATE user SET balance=balance-20 WHERE

id=1;

UPDATE user SET balance=balance-10 WHERE

id=1;

Проблемы параллельного выполнения транзакций

Грязное чтение (dirty read) - чтение данных, добавленных или изменённых незафиксированной транзакцией, которая впоследствии откатится.

balance = 100

balance = 125 в транзакции 2

Транзакция 1 Транзакция 2

SELECT balance FROM user WHERE id=1;

UPDATE users SET balance=balance+25 WHERE id=1;

ROLLBACK;

SELECT balance FROM users WHERE id=1;

Проблемы параллельного выполнения транзакций

Неповторяющееся чтение (non-repeatable read) - при повторном чтении в рамках одной транзакции, ранее прочитанные данные оказываются изменёнными.balance = 100

balance = 100, затем 125 в одной и той же транзакции

Транзакция 1 Транзакция 2

SELECT balance FROM users WHERE id=1;

UPDATE users SET balance=balance+25 WHERE id=1;

COMMIT;

SELECT balance FROM users WHERE id=1;

SELECT balance FROM users WHERE id=1;

Проблемы параллельного выполнения транзакций

Фантомное чтение (phantom reads)

f2 = 10, затем 35 в одной и той же транзакции

Транзакция 1 Транзакция 2

SELECT SUM(balance) FROM users WHERE age BETWEEN 18 AND 25;

SELECT SUM(balance) FROM users WHERE age BETWEEN 18 AND 25;

INSERT INTO users (age, balance) VALUES (20, 100);COMMIT;

Проблемы параллельного выполнения транзакций

● Потерянное обновление (lost update) - при одновременном изменении одного блока данных разными транзакциями, одно из изменений теряется

Проблемы параллельного выполнения транзакций

● Потерянное обновление (lost update) - при одновременном изменении одного блока данных разными транзакциями, одно из изменений теряется

● Грязное чтение (dirty read) - чтение данных, добавленных или изменённых транзакцией, которая впоследствии откатится

Проблемы параллельного выполнения транзакций

● Потерянное обновление (lost update) - при одновременном изменении одного блока данных разными транзакциями, одно из изменений теряется

● Грязное чтение (dirty read) - чтение данных, добавленных или изменённых незафиксированной транзакцией

● Неповторяющееся чтение (non-repeatable read) - при повторном чтении в рамках одной транзакции, ранее прочитанные данные оказываются изменёнными

Проблемы параллельного выполнения транзакций

● Потерянное обновление (lost update) - при одновременном изменении одного блока данных разными транзакциями, одно из изменений теряется

● Грязное чтение (dirty read) - чтение данных, добавленных или изменённых незафиксированной транзакцией

● Неповторяющееся чтение (non-repeatable read) - при повторном чтении в рамках одной транзакции, ранее прочитанные данные оказываются изменёнными

● Фантомное чтение (phantom reads) - Одна транзакция в ходе своего выполнения несколько раз выбирает множество строк по одним и тем же критериям. Другая транзакция в интервалах между этими выборками добавляет или удаляет строки, попадающие в критерии выборки первой транзакции, и успешно заканчивается. В результате одни и те же выборки в первой транзакции дают разные множества строк.

Уровни изоляции транзакций (ANSI SQL92 )

Уровень изоляции Потерянное обновление

Грязное чтение

Неповторяющееся чтение

Фантомное чтение

READ UNCOMMITTED

+ - - -

READ COMMITTED + + - -

REPEATABLE READ + + + -

SERIALIZABLE + + + +

Механизмы для реализации требований ACIDБлокировки (locks) - механизм синхронизации, позволяющий ограничить доступ к разделяемому ресурсу между несколькими параллельными процессами

X - exclusive lock

S- shared lock

Механизмы для реализации требований ACIDMVCC (Multiversion concurrency control) - многоверсионный контроль конкурентных транзакций

Механизм обеспечения одновременного конкурентного доступа к БД, заключающийся в предоставлении каждому пользователю «снимка» БД, обладающего тем свойством, что вносимые пользователем изменения в БД невидимы другим пользователям до момента фиксации транзакции

InnoDB

● InnoDB - транзакционное хранилище данных (storage engine) для MySQL.

● Появилось в версии 3.23, с версии 5.5 - хранилище по умолчанию● Percona, MariaDB - форки● Поддерживает все 4 уровня изоляции транзакций, уровень изоляции

по умолчанию - REPEATABLE READ● Реализация MVCC - rollback segment, DB_TRX_ID, DB_ROLL_PTR● Блокировки - shared, exclusive, next-key lock, gap lock, deadlock

detection

Реализация ACID1. Atomicity

a. transactionsb. commitc. rollback

2. Consistencya. redo logb. doublewrite buffer

3. Isolationa. lockingb. mvcc

4. Durabilitya. doublewrite bufferb. sync_binlogc. innodb_flush_log_at_trx_commit

Механизм MVCC

журнал транзакций

Rollback SegmentDB_TRX_IDDB_ROLL_PTR

Блокировки в InnoDBExclusive (X) - эксклюзивные (монопольные, блокировки записи)Shared (S) - совместные (разделяемые, блокировки чтения)

2-phase locking (фаза установки блокировок, фаза снятия)

Intention locks - блокировки намерения

X IX S IS

X Conflict Conflict Conflict Conflict

IX ConflictCompatibl

eConflict

Compatibl

e

S Conflict ConflictCompatibl

e

Compatibl

e

IS ConflictCompatibl

e

Compatibl

e

Compatibl

e

Совместимость блокировок

Пользовательские блокировки

Установка S блокировки:SELECT … LOCK IN SHARE MODE;

SELECT * FROM user WHERE id=1 LOCK IN SHARE MODE;INSERT INTO order (user_id, product_id) VALUES (...);

Пользовательские блокировки

Установка S блокировки:SELECT … LOCK IN SHARE MODE;

SELECT * FROM user WHERE id=1 LOCK IN SHARE MODE;INSERT INTO order (user_id, product_id) VALUES (...);

Альтернатива: constraints on users and orders

Пользовательские блокировки

Установка X блокировки:SELECT … FOR UPDATE;

SELECT balance FROM user WHERE id=1 FOR UPDATE;если balance > priceUPDATE user SET balance=balance - price WHERE id=1;

Пользовательские блокировки

Установка X блокировки:SELECT … FOR UPDATE;

SELECT balance FROM user WHERE id=1 FOR UPDATE;если balance > priceUPDATE user SET balance=balance - price WHERE id=1;

Альтернатива:UPDATE user SET balance=balance - price WHERE id=1 AND balance > price;

Блокировка следующего ключа и предотвращение фантомов

Record lock - блокировка индексных записей Gap lock - блокировка интервала между записями, перед первой записью или после последнейNext-key lock - комбинация блокировки записи и интервала

SELECT * FROM userWHERE id > 5 FOR UPDATE;

SELECT * FROM userWHERE name = 'nikolay' FOR UPDATE;

Блокировки в различных операциях

● SELECT ... FROM ...: производится из образа базы данных без блокировки

● SELECT ... FROM ... LOCK IN SHARE MODE: устанавливает S блокировку следующего ключа

● SELECT ... FROM ... FOR UPDATE: устанавливает X блокировку следующего ключа

● INSERT INTO ... VALUES (...): устанавливает X блокировку на вставленную строку.

● UPDATE ... SET ... WHERE ...: устанавливает X блокировку следующего ключа для каждой записи

● DELETE FROM ... WHERE ...: устанавливает X блокировку следующего ключа для каждой записи

Взаимоблокировки (deadlocks)

Транзакция 1 Транзакция 2

UPDATE user set balance=100 WHERE id=1;

UPDATE user set balance=100 WHERE id=2;COMMIT;

UPDATE user set balance=500 WHERE id=2;

UPDATE user set balance=500 WHERE id=1;COMMIT;

DEADLOCK

Как избежать взаимоблокировок?

● SHOW ENGINE INNODB STATUS● Короткие транзакции● Механизм для перезапуска транзакции● Планировать порядок выполнения операций в транзакции● Хорошие индексы для таблиц

Литература

The InnoDB Transaction Model and Lockinghttp://dev.mysql.com/doc/refman/5.6/en/innodb-transaction-model.html

Критика уровней изолированности в стандарте ANSI SQL

http://citforum.ru/database/classics/SQL_critiques/

Понимание SQLМартин Грабер

MySQL. Оптимизация производительности

High Perfomance MySQL

Авторы: Бэрон Шварц, Петр Зайцев, Вадим Ткаченко, Джереми Д. Зооднай, Дерек Дж. Баллинг, Арьен Ленц