SlideShare a Scribd company logo
Обработка
дедлоков в MySql
  Сергей Париев, Undev.Ru
    spariev@gmail.com
Содержание
• Дедлок - что это такое
• Неправильная организация доступа к
  данным + пример
• Специфика работы блокировок MySql
• Узнаем больше (SHOW ENGINE
  INNODB STATUS)
Что это такое
                  Дедлок - ситуация,
в которой 2 или более процесса ждут друг от друга
         освобождения занятых ресурсов,
             или более двух процессов
       ждут ресурсы в циклической порядке
      ( http://en.wikipedia.org/wiki/Deadlock )
Что это такое
                 простой пример

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

select name from events          select name from events
where id = 1 for update          where id = 2 for update

select name from events          select name from events
where id = 2 for update   FAIL   where id = 1 for update

InnoDB автоматически распознает дедлоки
    и откатывает одну из транзакций
Что это такое
Еще более простой пример
Причины дедлоков

•   Неправильная организация доступа к
    данным

• Специфика работы блокировок в БД
Неправильная организация доступа к данным


  Причины дедлоков
Неправильная организация доступа к данным

• Отсутствие фиксированного порядка
  обращения к таблицам и записям
• Некорректно спроектированная БД
Неправильная
организация доступа к
       данным
Неправильная организация доступа к данным


         Что это такое
Отсутствие фиксированного порядка доступа

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

select name from events          select name from events
where id = 1 for update          where id = 2 for update

select name from events          select name from events
where id = 2 for update   FAIL   where id = 1 for update

    В порядке                        В порядке
   возрастания                       убывания
Неправильная организация доступа к данным


    Порядок доступа

  • все манипуляции с данными лучше
     проводить в условленном порядке
  • например, в порядке возрастания
     первичного ключа
  • это снижает вероятность дедлоков
Неправильная организация доступа к данным


         Некорректно
     спроектированная БД

• Отсутствие необходимых индексов
• Иногда нужно разносить 1 таблицу на
  несколько, если она несет слишком
  много смысловой нагрузки
Пример
(основан на реальных событиях)
Пример


    Исходная задача
        (слегка анонимизирована)

• очередь событий (events)
• много операторов-клиентов,
  обрабатывающих события в режиме
  FIFO
Пример


Структура данных
                EVENTS
id      title   user_id   event_time   locked_at
...      ...      ...         ...         ...



      Индекс по полю locked_at
Пример


    first_unprocessed, v1
    Находим первое необработанное событие,
     “занимаем” его и возвращаем оператору:
SELECT id AS event_id, ... FROM events
WHERE locked_at IS NULL
OR locked_at < [1.minute.ago]
ORDER BY event_time ASC LIMIT 1
FOR UPDATE
UPDATE events SET locked_at = [Time.now]
WHERE id = [event_id]
Пример


                touch v1
 Обновляем блокировку, если обработка занимает
             более одной минуты
        (event_id получаем от клиента):

UPDATE events SET locked_at = [Time.now]
WHERE id = [event_id]
Пример


          DEADLOCK!
     (Различные пути доступа к данным)
    first_unprocessed                  touch

index_events_on_locked_at
                                   PRIMARY_KEY
      (при выборке
                                (в условии UPDATE)
 SELECT * ... FOR UPDATE)

                            index_events_on_locked_at
      PRIMARY_KEY
                                (при обновлении)
    (при обновлении)
Пример


                touch v2
Используем результат запроса из first_unprocessed в
    качестве семафора, после чего обновляем
                  блокировку:

SELECT id AS event_id FROM events
WHERE ...
FOR UPDATE
UPDATE events SET locked_at = [Time.now]
WHERE id = [event_id]
Пример
Пример


    first_unapproved v2
              Новое требование:
    выбирать события для указанного юзера.
В запрос добавляется условие user_id = [user_id]
               Новая проблема:
  Для пользователей с малым кол-вом записей
      MySql использует индекс по user_id
        (снова различные пути доступа)
                   Решение?
FORCE INDEX index_events_on_locked_at
Пример


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


               Решение
         Изменения в структуре БД
                     EVENT_LOCKS
id        event_id     user_id   event_time   locked_at
...          ...         ...         ...         ...


• Отдельная таблица для блокировок
• Записи добавляются/удаляются в
      Event#after_create/update/destroy
Неправильная организация доступа к данным


             Summary
                Дедлоки,
обусловленные неправильной организацией
   доступа к данным, можно устранить:


• Унифицировать порядок обращения
• Разнести конфликтующий функционал по
  разным таблицам
Специфика работы
блокировок в MySql
Cпецифика работы блокировок MySql


  Причины дедлоков
   специфика работы блокировок MySql

• MySql 5.0
• InnoDB
• InnoDB блокирует не строки таблицы, а
  записи индексов
• (если в таблице нет индексов, InnoDB
  создает скрытый)
Cпецифика работы блокировок MySql


Блокировки в MySql
  Row Lock         Блокировка записи индекса



                     Row lock + блокировка
Next-key Lock
                  “промежутка” записей индекса
Cпецифика работы блокировок MySql


          Row Lock
• Блокируется только одна запись
• Используется только при выборке с
  использованием уникального индекса


 SELECT name FROM events WHERE id = 3
         (id - первичный ключ)
Cпецифика работы блокировок MySql


                  Next-key Lock
Next-key Lock =
блокировка записи (Row Lock) +
блокировка “промежутка” перед записью


                             Пример
  (-inf.. 3]        (3..5]    (5..10]   (10..15]   (15..+inf)
Cпецифика работы блокировок MySql


          Next-key Lock
используется для предотвращения phantom read
          Транзакция 1                Транзакция 2

SELECT * FROM events WHERE
another_id > 8 FOR UPDATE
                                 INSERT INTO events
                               (another_id) VALUES (9)
                                         FAIL
SELECT * FROM events WHERE   2й запрос возвращает другие
another_id > 8 FOR UPDATE              данные
Cпецифика работы блокировок MySql


              Next-key Lock
InnoDB блокирует все встреченные записи индекса,
используемого в запросе
SELECT * FROM events WHERE another_id > 8
FOR UPDATE

   ... 3        3..5      5..10    10..15      15...
Cпецифика работы блокировок MySql


         Next-key Lock
Если не используется индекс, InnoDB фактически
            блокирует все таблицу!
        Next-key lock можно отключить:
           (возможен phantom read)
 • изменить уровень изоляции на READ
    COMMITTED
 • включить системную переменную
    innodb_locks_unsafe_for_binlog
Cпецифика работы блокировок MySql


            MySql 5.1
   ( подробнее тут - http://bit.ly/4iF2mu )

• меньше блокировок в READ-
  COMMITTED при DML операциях -
  блокируются только те строки, которые
  действительно изменяются
• более производительная блокировка для
  AUTO_INCREMENT полей
Cпецифика работы блокировок MySql


       Проблема
      Много блокировок
               +
      длинная транзакция
               =
        много дедлоков
Cпецифика работы блокировок MySql


             Решение

• Делаем мало блокировок (правильные
  индексы)
• Используем короткие транзакции
Cпецифика работы блокировок MySql


           Пример 1
• better_nested_set
• не приспособлен к конкурентной
  модификации дерева - большие
  транзакции, update по всей таблице
• has_tree как альтернатива (данные об
  иерархии хранятся в отдельной таблице)
  http://github.com/dima-exe/has_tree
Cпецифика работы блокировок MySql


           Пример 2
• counters в has_many
• update-ы в произвольном порядке,
  вероятность дедлоков выше при
  длинных транзакциях
• альтернатива - вынести счетчики в
  отдельную таблицу, уменьшить размеры
  транзакций
Cпецифика работы блокировок MySql


           Что делать
• deadlock_retry ( http://github.com/rails/
  deadlock_retry ) - если дедлоков мало
• LOCK TABLES - блокировки на уровне
  таблиц (think MyISAM)
• Использовать READ-COMMITTED
  (помним о phantom-read)
Cпецифика работы блокировок MySql


           Summary
• Используем индексы
• Короткие транзакции
• Если дедлоков мало, их можно
  игнорировать, перезапуская транзакции
Узнаем больше
 SHOW ENGINE INNODB STATUS
Обработка дедлоков в MySql
Описаны последние 2 транзакции
          и последние запросы из каждой
(не обязательно именно те, которые вызвали дедлок)
Ресурсы
• http://dev.mysql.com/doc/refman/5.0/en/
  innodb-deadlocks.html
• http://www.mysqlperformanceblog.com/
  ( http://bit.ly/wchKP , http://bit.ly/1Bz0AY )
• http://www.xaprb.com/blog/ ( http://bit.ly/
  Ldq2t , http://bit.ly/8nRFn , http://bit.ly/
  8nRFn )
Обработка дедлоков в MySql

More Related Content

PPT
Сергей Париев - "обработка дедлоков в MySql"
PPTX
Синхронный MODX: как сделать настоящую синхронизацию и не застрелиться
PPTX
MySQL Optimization. Russian
PPTX
вебинар транзакционные блокировки
PDF
Организация хранения данных
PPT
hl++ Rubtsov
PDF
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
PPT
МАПО Лекция 11 Потоки данных DFD
Сергей Париев - "обработка дедлоков в MySql"
Синхронный MODX: как сделать настоящую синхронизацию и не застрелиться
MySQL Optimization. Russian
вебинар транзакционные блокировки
Организация хранения данных
hl++ Rubtsov
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
МАПО Лекция 11 Потоки данных DFD

What's hot (14)

PDF
Laravel websockets
PPT
лабраб 1
PPTX
О чем мы забываем в QA или “Знакомьтесь – Manageability!”
PDF
ZooKeeper Java Cloud
PDF
Анатолий Пласковский "Миллионы карточных платежей за месяц, или как потерять ...
PPTX
Безболезненный Fallback cache на Scala / Олег Нижников (Tinkoff.ru)
PPTX
Введение в Microsoft Silverlight 3.0
PDF
Делаем очередь поверх Кассандры
PPTX
«Секретные» технологии инвестиционных банков / Алексей Рагозин (Дойче Банк)
PPTX
Взломать сайт на ASP.NET
PPT
поиск узких мест в производительности My sql ботанический определитель. г. ру...
PPTX
Эволюция корпоративных Web приложений. Молотков Андрей D2D Just.NET
PPT
HighLoad++ 2009 In-Memory Data Grids
DOC
лабораторная работа №1
Laravel websockets
лабраб 1
О чем мы забываем в QA или “Знакомьтесь – Manageability!”
ZooKeeper Java Cloud
Анатолий Пласковский "Миллионы карточных платежей за месяц, или как потерять ...
Безболезненный Fallback cache на Scala / Олег Нижников (Tinkoff.ru)
Введение в Microsoft Silverlight 3.0
Делаем очередь поверх Кассандры
«Секретные» технологии инвестиционных банков / Алексей Рагозин (Дойче Банк)
Взломать сайт на ASP.NET
поиск узких мест в производительности My sql ботанический определитель. г. ру...
Эволюция корпоративных Web приложений. Молотков Андрей D2D Just.NET
HighLoad++ 2009 In-Memory Data Grids
лабораторная работа №1
Ad

Similar to Обработка дедлоков в MySql (20)

PPT
PDF
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
PPTX
Транзакции и блокировки в MySql. Теория и практика
PDF
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
ODP
Wonderful World Of Mysql Storage Engines Hl2008 Rus
PDF
За гранью NoSQL: NewSQL на Cassandra
PDF
DFD моделирование - диаграммы потоков данных
PPTX
Мониторинг, тюнинг и оптимизация баз данных, используя продукты Dell Software
PPTX
Мониторинг, тюнинг и оптимизация баз данных, используя продукты Dell Software
PDF
"Производительность MySQL: что нового?"
PDF
Введение в отладку производительности MySQL приложений
PDF
Отладка производительности СУБД MySQL
PDF
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
PPTX
Web осень 2013 лекция 9
PDF
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
PPTX
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
PPTX
Тестирование на проникновение в сетях Microsoft (v.2)
ODP
Innodb Scalability And New Features Hl2008 Rus
PDF
И снова разработка под iOS. Павел Тайкало
PDF
Логгирование. Зачем? Когда? Сколько?
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Транзакции и блокировки в MySql. Теория и практика
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Wonderful World Of Mysql Storage Engines Hl2008 Rus
За гранью NoSQL: NewSQL на Cassandra
DFD моделирование - диаграммы потоков данных
Мониторинг, тюнинг и оптимизация баз данных, используя продукты Dell Software
Мониторинг, тюнинг и оптимизация баз данных, используя продукты Dell Software
"Производительность MySQL: что нового?"
Введение в отладку производительности MySQL приложений
Отладка производительности СУБД MySQL
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Web осень 2013 лекция 9
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
Тестирование на проникновение в сетях Microsoft (v.2)
Innodb Scalability And New Features Hl2008 Rus
И снова разработка под iOS. Павел Тайкало
Логгирование. Зачем? Когда? Сколько?
Ad

Обработка дедлоков в MySql

  • 1. Обработка дедлоков в MySql Сергей Париев, Undev.Ru spariev@gmail.com
  • 2. Содержание • Дедлок - что это такое • Неправильная организация доступа к данным + пример • Специфика работы блокировок MySql • Узнаем больше (SHOW ENGINE INNODB STATUS)
  • 3. Что это такое Дедлок - ситуация, в которой 2 или более процесса ждут друг от друга освобождения занятых ресурсов, или более двух процессов ждут ресурсы в циклической порядке ( http://en.wikipedia.org/wiki/Deadlock )
  • 4. Что это такое простой пример Транзакция 1 Транзакция 2 select name from events select name from events where id = 1 for update where id = 2 for update select name from events select name from events where id = 2 for update FAIL where id = 1 for update InnoDB автоматически распознает дедлоки и откатывает одну из транзакций
  • 5. Что это такое Еще более простой пример
  • 6. Причины дедлоков • Неправильная организация доступа к данным • Специфика работы блокировок в БД
  • 7. Неправильная организация доступа к данным Причины дедлоков Неправильная организация доступа к данным • Отсутствие фиксированного порядка обращения к таблицам и записям • Некорректно спроектированная БД
  • 9. Неправильная организация доступа к данным Что это такое Отсутствие фиксированного порядка доступа Транзакция 1 Транзакция 2 select name from events select name from events where id = 1 for update where id = 2 for update select name from events select name from events where id = 2 for update FAIL where id = 1 for update В порядке В порядке возрастания убывания
  • 10. Неправильная организация доступа к данным Порядок доступа • все манипуляции с данными лучше проводить в условленном порядке • например, в порядке возрастания первичного ключа • это снижает вероятность дедлоков
  • 11. Неправильная организация доступа к данным Некорректно спроектированная БД • Отсутствие необходимых индексов • Иногда нужно разносить 1 таблицу на несколько, если она несет слишком много смысловой нагрузки
  • 13. Пример Исходная задача (слегка анонимизирована) • очередь событий (events) • много операторов-клиентов, обрабатывающих события в режиме FIFO
  • 14. Пример Структура данных EVENTS id title user_id event_time locked_at ... ... ... ... ... Индекс по полю locked_at
  • 15. Пример first_unprocessed, v1 Находим первое необработанное событие, “занимаем” его и возвращаем оператору: SELECT id AS event_id, ... FROM events WHERE locked_at IS NULL OR locked_at < [1.minute.ago] ORDER BY event_time ASC LIMIT 1 FOR UPDATE UPDATE events SET locked_at = [Time.now] WHERE id = [event_id]
  • 16. Пример touch v1 Обновляем блокировку, если обработка занимает более одной минуты (event_id получаем от клиента): UPDATE events SET locked_at = [Time.now] WHERE id = [event_id]
  • 17. Пример DEADLOCK! (Различные пути доступа к данным) first_unprocessed touch index_events_on_locked_at PRIMARY_KEY (при выборке (в условии UPDATE) SELECT * ... FOR UPDATE) index_events_on_locked_at PRIMARY_KEY (при обновлении) (при обновлении)
  • 18. Пример touch v2 Используем результат запроса из first_unprocessed в качестве семафора, после чего обновляем блокировку: SELECT id AS event_id FROM events WHERE ... FOR UPDATE UPDATE events SET locked_at = [Time.now] WHERE id = [event_id]
  • 20. Пример first_unapproved v2 Новое требование: выбирать события для указанного юзера. В запрос добавляется условие user_id = [user_id] Новая проблема: Для пользователей с малым кол-вом записей MySql использует индекс по user_id (снова различные пути доступа) Решение? FORCE INDEX index_events_on_locked_at
  • 21. Пример Проблемы • снижение скорости работы при увеличении размеров таблицы • конфликты с другими частями приложения, использующими Events
  • 22. Пример Решение Изменения в структуре БД EVENT_LOCKS id event_id user_id event_time locked_at ... ... ... ... ... • Отдельная таблица для блокировок • Записи добавляются/удаляются в Event#after_create/update/destroy
  • 23. Неправильная организация доступа к данным Summary Дедлоки, обусловленные неправильной организацией доступа к данным, можно устранить: • Унифицировать порядок обращения • Разнести конфликтующий функционал по разным таблицам
  • 25. Cпецифика работы блокировок MySql Причины дедлоков специфика работы блокировок MySql • MySql 5.0 • InnoDB • InnoDB блокирует не строки таблицы, а записи индексов • (если в таблице нет индексов, InnoDB создает скрытый)
  • 26. Cпецифика работы блокировок MySql Блокировки в MySql Row Lock Блокировка записи индекса Row lock + блокировка Next-key Lock “промежутка” записей индекса
  • 27. Cпецифика работы блокировок MySql Row Lock • Блокируется только одна запись • Используется только при выборке с использованием уникального индекса SELECT name FROM events WHERE id = 3 (id - первичный ключ)
  • 28. Cпецифика работы блокировок MySql Next-key Lock Next-key Lock = блокировка записи (Row Lock) + блокировка “промежутка” перед записью Пример (-inf.. 3] (3..5] (5..10] (10..15] (15..+inf)
  • 29. Cпецифика работы блокировок MySql Next-key Lock используется для предотвращения phantom read Транзакция 1 Транзакция 2 SELECT * FROM events WHERE another_id > 8 FOR UPDATE INSERT INTO events (another_id) VALUES (9) FAIL SELECT * FROM events WHERE 2й запрос возвращает другие another_id > 8 FOR UPDATE данные
  • 30. Cпецифика работы блокировок MySql Next-key Lock InnoDB блокирует все встреченные записи индекса, используемого в запросе SELECT * FROM events WHERE another_id > 8 FOR UPDATE ... 3 3..5 5..10 10..15 15...
  • 31. Cпецифика работы блокировок MySql Next-key Lock Если не используется индекс, InnoDB фактически блокирует все таблицу! Next-key lock можно отключить: (возможен phantom read) • изменить уровень изоляции на READ COMMITTED • включить системную переменную innodb_locks_unsafe_for_binlog
  • 32. Cпецифика работы блокировок MySql MySql 5.1 ( подробнее тут - http://bit.ly/4iF2mu ) • меньше блокировок в READ- COMMITTED при DML операциях - блокируются только те строки, которые действительно изменяются • более производительная блокировка для AUTO_INCREMENT полей
  • 33. Cпецифика работы блокировок MySql Проблема Много блокировок + длинная транзакция = много дедлоков
  • 34. Cпецифика работы блокировок MySql Решение • Делаем мало блокировок (правильные индексы) • Используем короткие транзакции
  • 35. Cпецифика работы блокировок MySql Пример 1 • better_nested_set • не приспособлен к конкурентной модификации дерева - большие транзакции, update по всей таблице • has_tree как альтернатива (данные об иерархии хранятся в отдельной таблице) http://github.com/dima-exe/has_tree
  • 36. Cпецифика работы блокировок MySql Пример 2 • counters в has_many • update-ы в произвольном порядке, вероятность дедлоков выше при длинных транзакциях • альтернатива - вынести счетчики в отдельную таблицу, уменьшить размеры транзакций
  • 37. Cпецифика работы блокировок MySql Что делать • deadlock_retry ( http://github.com/rails/ deadlock_retry ) - если дедлоков мало • LOCK TABLES - блокировки на уровне таблиц (think MyISAM) • Использовать READ-COMMITTED (помним о phantom-read)
  • 38. Cпецифика работы блокировок MySql Summary • Используем индексы • Короткие транзакции • Если дедлоков мало, их можно игнорировать, перезапуская транзакции
  • 39. Узнаем больше SHOW ENGINE INNODB STATUS
  • 41. Описаны последние 2 транзакции и последние запросы из каждой (не обязательно именно те, которые вызвали дедлок)
  • 42. Ресурсы • http://dev.mysql.com/doc/refman/5.0/en/ innodb-deadlocks.html • http://www.mysqlperformanceblog.com/ ( http://bit.ly/wchKP , http://bit.ly/1Bz0AY ) • http://www.xaprb.com/blog/ ( http://bit.ly/ Ldq2t , http://bit.ly/8nRFn , http://bit.ly/ 8nRFn )