SlideShare une entreprise Scribd logo
1  sur  43
Télécharger pour lire hors ligne
Обработка
дедлоков в 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
Описаны последние 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

Contenu connexe

Tendances

О чем мы забываем в QA или “Знакомьтесь – Manageability!”
О чем мы забываем в QA или “Знакомьтесь – Manageability!”О чем мы забываем в QA или “Знакомьтесь – Manageability!”
О чем мы забываем в QA или “Знакомьтесь – Manageability!”SQALab
 
Анатолий Пласковский "Миллионы карточных платежей за месяц, или как потерять ...
Анатолий Пласковский "Миллионы карточных платежей за месяц, или как потерять ...Анатолий Пласковский "Миллионы карточных платежей за месяц, или как потерять ...
Анатолий Пласковский "Миллионы карточных платежей за месяц, или как потерять ...IT Event
 
Безболезненный Fallback cache на Scala / Олег Нижников (Tinkoff.ru)
Безболезненный Fallback cache на Scala / Олег Нижников (Tinkoff.ru)Безболезненный Fallback cache на Scala / Олег Нижников (Tinkoff.ru)
Безболезненный Fallback cache на Scala / Олег Нижников (Tinkoff.ru)Ontico
 
Введение в Microsoft Silverlight 3.0
Введение в Microsoft Silverlight 3.0Введение в Microsoft Silverlight 3.0
Введение в Microsoft Silverlight 3.0akrakovetsky
 
Делаем очередь поверх Кассандры
Делаем очередь поверх КассандрыДелаем очередь поверх Кассандры
Делаем очередь поверх КассандрыDotNetConf
 
«Секретные» технологии инвестиционных банков / Алексей Рагозин (Дойче Банк)
«Секретные» технологии инвестиционных банков / Алексей Рагозин (Дойче Банк)«Секретные» технологии инвестиционных банков / Алексей Рагозин (Дойче Банк)
«Секретные» технологии инвестиционных банков / Алексей Рагозин (Дойче Банк)Ontico
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NETPositive Hack Days
 
поиск узких мест в производительности My sql ботанический определитель. г. ру...
поиск узких мест в производительности My sql ботанический определитель. г. ру...поиск узких мест в производительности My sql ботанический определитель. г. ру...
поиск узких мест в производительности My sql ботанический определитель. г. ру...rit2011
 
Эволюция корпоративных Web приложений. Молотков Андрей D2D Just.NET
Эволюция корпоративных Web приложений. Молотков Андрей D2D Just.NETЭволюция корпоративных Web приложений. Молотков Андрей D2D Just.NET
Эволюция корпоративных Web приложений. Молотков Андрей D2D Just.NETDev2Dev
 
HighLoad++ 2009 In-Memory Data Grids
HighLoad++ 2009 In-Memory Data GridsHighLoad++ 2009 In-Memory Data Grids
HighLoad++ 2009 In-Memory Data GridsAlexey Kharlamov
 
лабораторная работа №1
лабораторная работа №1лабораторная работа №1
лабораторная работа №1НГТУ
 

Tendances (14)

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

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

Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Badoo Development
 
Транзакции и блокировки в MySql. Теория и практика
Транзакции и блокировки в MySql. Теория и практикаТранзакции и блокировки в MySql. Теория и практика
Транзакции и блокировки в MySql. Теория и практикаNikolay Gondin
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьTanya Denisyuk
 
Wonderful World Of Mysql Storage Engines Hl2008 Rus
Wonderful World Of Mysql Storage Engines Hl2008 RusWonderful World Of Mysql Storage Engines Hl2008 Rus
Wonderful World Of Mysql Storage Engines Hl2008 RusOntico
 
За гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на CassandraЗа гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на Cassandraodnoklassniki.ru
 
DFD моделирование - диаграммы потоков данных
DFD моделирование - диаграммы потоков данныхDFD моделирование - диаграммы потоков данных
DFD моделирование - диаграммы потоков данныхTimofei Tatarinov
 
Мониторинг, тюнинг и оптимизация баз данных, используя продукты Dell Software
Мониторинг, тюнинг и оптимизация баз данных, используя продукты Dell SoftwareМониторинг, тюнинг и оптимизация баз данных, используя продукты Dell Software
Мониторинг, тюнинг и оптимизация баз данных, используя продукты Dell SoftwareBAKOTECH
 
Мониторинг, тюнинг и оптимизация баз данных, используя продукты Dell Software
Мониторинг, тюнинг и оптимизация баз данных, используя продукты Dell SoftwareМониторинг, тюнинг и оптимизация баз данных, используя продукты Dell Software
Мониторинг, тюнинг и оптимизация баз данных, используя продукты Dell SoftwareMarina Gryshko
 
"Производительность MySQL: что нового?"
"Производительность MySQL: что нового?""Производительность MySQL: что нового?"
"Производительность MySQL: что нового?"Badoo Development
 
Введение в отладку производительности MySQL приложений
Введение в отладку производительности MySQL приложенийВведение в отладку производительности MySQL приложений
Введение в отладку производительности MySQL приложенийSveta Smirnova
 
Отладка производительности СУБД MySQL
Отладка производительности СУБД MySQLОтладка производительности СУБД MySQL
Отладка производительности СУБД MySQLSveta Smirnova
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 То, что вы хотели знать о HandlerSocket, но не смогли нагуглить То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьSergey Xek
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9Technopark
 
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется всеОмские ИТ-субботники
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...Ontico
 
Тестирование на проникновение в сетях Microsoft (v.2)
Тестирование на проникновение в сетях Microsoft (v.2)Тестирование на проникновение в сетях Microsoft (v.2)
Тестирование на проникновение в сетях Microsoft (v.2)Dmitry Evteev
 
Innodb Scalability And New Features Hl2008 Rus
Innodb Scalability And New Features Hl2008 RusInnodb Scalability And New Features Hl2008 Rus
Innodb Scalability And New Features Hl2008 RusOntico
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоStanfy
 
Логгирование. Зачем? Когда? Сколько?
Логгирование. Зачем? Когда? Сколько?Логгирование. Зачем? Когда? Сколько?
Логгирование. Зачем? Когда? Сколько?Ivan Fedorov
 

Similaire à Обработка дедлоков в MySql (20)

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

Dernier (9)

ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
 
Ransomware_Q3 2023. The report [RU].pdf
Ransomware_Q3 2023.  The report [RU].pdfRansomware_Q3 2023.  The report [RU].pdf
Ransomware_Q3 2023. The report [RU].pdf
 
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdfMalware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
 
MS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdfMS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdf
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
 
2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
 

Обработка дедлоков в 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
  • 40.
  • 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 )