Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Обработка
дедлоков в MySql
  Сергей Париев, Undev.Ru
    spariev@gmail.com
Содержание
• Дедлок - что это такое
• Неправильная организация доступа к
  данным + пример
• Специфика работы блокировок M...
Что это такое
                  Дедлок - ситуация,
в которой 2 или более процесса ждут друг от друга
         освобождения...
Что это такое
                 простой пример

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

select name from events...
Что это такое
Еще более простой пример
Причины дедлоков

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

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


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

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


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

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


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

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


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

• Отсутствие необходимых индекс...
Пример
(основан на реальных событиях)
Пример


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

• очередь событий (events)
• много операторов-клиентов,
  о...
Пример


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


    first_unprocessed, v1
    Находим первое необработанное событие,
     “занимаем” его и возвращаем оператору:
S...
Пример


                touch v1
 Обновляем блокировку, если обработка занимает
             более одной минуты
        (...
Пример


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

index_eve...
Пример


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


    first_unapproved v2
              Новое требование:
    выбирать события для указанного юзера.
В запрос добавл...
Пример


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


               Решение
         Изменения в структуре БД
                     EVENT_LOCKS
id        event_id     ...
Неправильная организация доступа к данным


             Summary
                Дедлоки,
обусловленные неправильной орган...
Специфика работы
блокировок в MySql
Cпецифика работы блокировок MySql


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

• MySql 5.0
• InnoDB
• InnoDB...
Cпецифика работы блокировок MySql


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



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


          Row Lock
• Блокируется только одна запись
• Используется только при выборке ...
Cпецифика работы блокировок MySql


                  Next-key Lock
Next-key Lock =
блокировка записи (Row Lock) +
блокиро...
Cпецифика работы блокировок MySql


          Next-key Lock
используется для предотвращения phantom read
          Транзак...
Cпецифика работы блокировок MySql


              Next-key Lock
InnoDB блокирует все встреченные записи индекса,
используе...
Cпецифика работы блокировок MySql


         Next-key Lock
Если не используется индекс, InnoDB фактически
            блок...
Cпецифика работы блокировок MySql


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

• меньше блокировок...
Cпецифика работы блокировок MySql


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


             Решение

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


           Пример 1
• better_nested_set
• не приспособлен к конкурентной
  модификации...
Cпецифика работы блокировок MySql


           Пример 2
• counters в has_many
• update-ы в произвольном порядке,
  вероятн...
Cпецифика работы блокировок MySql


           Что делать
• deadlock_retry ( http://github.com/rails/
  deadlock_retry ) -...
Cпецифика работы блокировок MySql


           Summary
• Используем индексы
• Короткие транзакции
• Если дедлоков мало, их...
Узнаем больше
 SHOW ENGINE INNODB STATUS
Описаны последние 2 транзакции
          и последние запросы из каждой
(не обязательно именно те, которые вызвали дедлок)
Ресурсы
• http://dev.mysql.com/doc/refman/5.0/en/
  innodb-deadlocks.html
• http://www.mysqlperformanceblog.com/
  ( http:...
Обработка дедлоков в MySql
Обработка дедлоков в MySql
Upcoming SlideShare
Loading in …5
×

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

3,841 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

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

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

×