@mysql_ru

Страница 34 из 142
Fike
29.06.2017
11:52:57
если про это

lost
29.06.2017
11:53:22
про это,но автор как я понял хотел что-то вроде системы очередей сделать

чтобы захватить строку и больше ее никто заюзать не смог

Google
Nurik
29.06.2017
12:04:11
чтобы захватить строку и больше ее никто заюзать не смог
Да, нужно чтобы в выборке в другой паралелльной транзакции был выбран другой водитель, т.к. он уже занят.

ну, в этом случае for update не нужен
Т.е. в моём случае использование FOR UPDATE не имеет смысла, т.к. внутренний механизм сам разрулит эту ситуацию ?

Fike
29.06.2017
12:05:25
насколько понимаю, да (головой сейчас немного в других облаках)

lost
29.06.2017
12:07:00
иначе блокировка на строку будет в момент обновления

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

Fike
29.06.2017
12:07:44
не в момент чтения?

lost
29.06.2017
12:08:49
нет, там неблокирующее чтение, строка читается из снепшота

Alexey
29.06.2017
12:09:28
Да, нужно чтобы в выборке в другой паралелльной транзакции был выбран другой водитель, т.к. он уже занят.
правильно я понимаю, что в каждой транзакции нужно взять первого незанятого водителя, пометить его как занятого, а потом дальше с его id что-то сделать?

Fike
29.06.2017
12:11:43
Так, теперь уже для тупого меня. Там же REPEATABLE READ по умолчанию. Разве он не гарантирует, что между r1 ... w1 не будет другой записи?

в смысле я понял про блокировку, но не понимаю важности этого момента

Alexey
29.06.2017
12:12:18
Да. Правильно понимаете.
Тогда самым правильным решением будет SELECT ... FOR UPDATE SKIP LOCKED. Но это только с 8.0: https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html

Google
Alexey
29.06.2017
12:12:36
там в самом конце страницы есть пример, иллюстрирующий что это такое

если есть возможность использовать 8.0, то лучше её. иначе придётся костыли городить

lost
29.06.2017
12:13:29
сомневаюсь что кто-то еще в проде её юзает... но не об этом сейчас

Alexey
29.06.2017
12:13:54
ну, не всё, что разработчики используют, обязательно используется в проде

даже чаще наоборот :)

Nurik
29.06.2017
12:16:46
а не в момент старта транзакции
Хочу подвести небольшой итог: 1. FOR UPDATE использовать! 2. Это в свою очередь гарантирует, что необходимое мне поведение будет достигнуто.

Верно я понял ?

Alexey
29.06.2017
12:19:06
Хочу подвести небольшой итог: 1. FOR UPDATE использовать! 2. Это в свою очередь гарантирует, что необходимое мне поведение будет достигнуто.
не совсем. простой FOR UPDATE заблокирует параллельные транзакции, пока текущая не закончится. это может быть приемлимым, а может и нет — зависит от приложения

Nurik
29.06.2017
12:19:17
Тогда самым правильным решением будет SELECT ... FOR UPDATE SKIP LOCKED. Но это только с 8.0: https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html
Очень интересно. Обязательно посмотрю. Правда боюсь падений в продакшене. Просто на носу опытная эксплуатация.

Alexey
29.06.2017
12:19:38
ну если на носу, тогда да, не надо 8.0

lost
29.06.2017
12:19:53
огосподи

что это за дичь

?

уже эмодзи не оттправишь

Nurik
29.06.2017
12:22:39
не совсем. простой FOR UPDATE заблокирует параллельные транзакции, пока текущая не закончится. это может быть приемлимым, а может и нет — зависит от приложения
1. Я так понимаю, решение также затронет производительность в целом? 2. Какие мне еще нужно рассмотреть критерии прежде чем убедиться, что мне необходимо использование FOR UPDATE ?

lost
29.06.2017
12:24:21
Затронет производительность

потому что for update это неявный serializable будет, возможна эскалация блокировок и все будет работать медленнее

Fike
29.06.2017
12:26:28
контеншн в любом случае ничего хорошего не сулит, тут вопрос в том, сколько может запросов прийти на одного и того же парня

lost
29.06.2017
12:26:33
Так, теперь уже для тупого меня. Там же REPEATABLE READ по умолчанию. Разве он не гарантирует, что между r1 ... w1 не будет другой записи?
между r1 и w1 не будет, но благодарая for update r2 из параллельной транзакции не начнется пока не будет коммита

Google
lost
29.06.2017
12:26:34
во

Fike
29.06.2017
12:26:35
если один-два, то вряд ли небеса рухнут

Alexey
29.06.2017
12:28:51
1. Я так понимаю, решение также затронет производительность в целом? 2. Какие мне еще нужно рассмотреть критерии прежде чем убедиться, что мне необходимо использование FOR UPDATE ?
1. Да, все транзакции будут по сути выполнятся одна за другой. Это может и не быть проблемой. Главное следить, чтобы внутри транзакции потом не делалось что-то долгое, типа отправки письма или что-то в этом духе. Сделать минимальную работу, которую нужно сделать на стороне СУБД и закоммитить 2. Да тут выбор небольшой. Можно обойтись без FOR UPDATE, но будет или такая же сериализация, или небезопасно с точки зрения параллельных транзакций

Nurik
29.06.2017
12:31:58
если один-два, то вряд ли небеса рухнут
Ситуация следующая: В одной густонаселенной местности могут одновременно прийти от 10 до сотни запросов, если радиус поиска в 3км. Из этого следует максимум 100 запросов теоритических. Вот если исходить из этих данных, то стоит ли ?

lost
29.06.2017
12:32:21
если транзакции быстрые - почему нет?

главное правило: транзакции короче, комиты чаще если все именно так и никаких подводных камней в том числе в дизайне бд нет - то ты этой сериализации даже не почувствуешь

Alexey
29.06.2017
12:34:54
если 100 транзакций в секунду в пике, но каждая транзакция занимает не более 1/100 секунды, то нет никаких проблем, даже если они сериализуются. Ваш К.О. :)

Nurik
29.06.2017
12:35:44
Всем спасибо за развернутые ответы и за дельные советы!

Nurik
29.06.2017
12:41:11
Сто запросов - это пик, или постоянная нагрузка?
Да, 100 запросов это теоритический пик в ЧНН, с одной области радиусом в 3км.

Ребят можете плиз накидать пару книжек, чтобы детальнее разобраться в тонкостях, относительно блокировок в mysql (mariadb) и так далее. (Язык не имеет значения, но если есть актуальное издание на русском, то было бы супер.)

lost
29.06.2017
12:51:44
Документация

Подробнее чем там вряд ли где будет

Nurik
29.06.2017
12:54:05
Подробнее чем там вряд ли где будет
Вот это печально. Потому что я с него начал разбираться. Там с примерами туговато, как мне показалось.

Fike
29.06.2017
12:55:04
https://www.microsoft.com/en-us/research/publication/a-critique-of-ansi-sql-isolation-levels/ вот в этой бумаге хорошо расписано, какие уровни изоляции с какими феноменами борются

Google
Fike
29.06.2017
12:55:13
(целиком я ее так и не прочитал)

lost
29.06.2017
12:56:44
https://habrahabr.ru/post/238513/

https://www.youtube.com/watch?v=mSQrRvo6l9I

это вот прям из первых уст

Alexey
29.06.2017
13:00:22
если нужен прямо совсем хардкор, то могу вот это рекомендовать: https://www.slideshare.net/valeriikravchuk1/understanding-innodb-locks-and-deadlocks

Nurik
29.06.2017
13:01:15
Во, спасибо за материалы. Почитаю/Посмотрю.

Alexey
29.06.2017
13:02:00
но в High Performance MySQL наверняка это всё в более удобнов виде описано

lost
29.06.2017
13:03:40
в книжке орейли с вороной?)

про блокировки там почти нет ничего, в основном упор на query performance

Alexey
29.06.2017
13:09:19
я уже не помню, щас проверю

да, как-то там размазано по всей книге. но полезная книжка в любом случае. и да, с птичкой на обложке

lost
29.06.2017
13:13:31
там есть еще одна, тоже с птичкой, тоже про мускуль, тоже полезная)

Талманн автор

Oleg
30.06.2017
02:55:24
Привет всим

Dmitry
01.07.2017
06:45:24
11 июля состоится встреча московской группы пользователей MySQL http://www.opennet.ru/opennews/art.shtml?num=46788 11 июля в 18:00 в офисе компании Mail.Ru состоится очередная встреча московской группы пользователей MySQL (Moscow MySQL User Group). Специальный гость встречи - Пётр Зайцев (CEO, Percona). Пётр сделает два доклада и ответит на вопросы участников встречи. Вход свободный. #opennet

Nurik
01.07.2017
09:32:50
Всем привет. Ребят у меня тут вопрос есть. Чтобы запрос r2 и w2 блокировались пока не исполнится r1 и w2 нужно обязательно делать запрос вида SELECT ...FOR UPDATE и оборачивать в транзакцию ? ИЛи нужно уровни изоляции трогать ещё ?

Всем привет. Ребят у меня тут вопрос есть. Чтобы запрос r2 и w2 блокировались пока не исполнится r1 и w2 нужно обязательно делать запрос вида SELECT ...FOR UPDATE и оборачивать в транзакцию ? ИЛи нужно уровни изоляции трогать ещё ?
Просто у меня как бы всё ещё возникают ситуации, когда один и тот же водитель с флагом "ЗАНЯТ" может прийти на запросы вида SELECT .. FOR UPDATE завернутые в транзакции.

Dan
01.07.2017
11:47:04
почему вот это плохо:

mysqldump -uroot -p database > utf8.dump

Google
Dan
01.07.2017
11:47:04
а вот это хорошо:

mysqldump -uroot -p database -r utf8.dump

Fike
01.07.2017
12:11:15
а кто сказал, что (а) - это а плохо, а (б) - хорошо, и что при этом было сказано дополнительно?

могу лишь предположить, что автор думал, что при использовании редиректа файл сначала будет создан целиком в оперативке - конечно, это не так

но что на самом деле думал автор, конечно, не знаю

Александр
01.07.2017
12:48:18
всем привет! )

ребят, подскажите пожалуйста что делать: имеется большая БД (80 гигов), её нужно перенести на другой сервак

весь день убил - ума не приложу как

делать mysqldump - это смертоубийство, до нового года дампить буду, а потом еще столько же разворачивать на новом серве :(

пробовал файлами копировать - получается быстро (~2 часа), но БД после этого не работает (хотя делал по доке)

Страница 34 из 142