Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день!
Вопрос относительно MySql 5.х, но я думаю это справедливо для всех версий, с которых MySql начал поддерживать множественные update.
1. Скажите пожалуйста, как и в какой последовательности MySql блокирует таблицы, входящие в список обновления?
Например: update tbl1,tbl2,tbl3 set tbl1.column1=tbl2.column2,tbl2.column1=10 where tbl1.id=1 and tbl2.id=tbl1.id and tbl3.id=tbl1.id and tbl3.perm=1
т.е. на все 3 таблицы будут накладываться блокировки записи или только на те, строки которых подвергаются изменениям в разделе set ..., а на tbl3 накладывается уже блокировка чтения? И как будет если tbl2 заблокирована другим клиентом и он с ней что то долго делает, в таком случае наш update заблокирует tbl1 и будет ждать пока не освободиться tbl2 и tbl3(тем самым долго удерживая tbl1) и только после доступа ко всем таблицам(заблокировав их все 3 или все 2 - tbl1 и tbl2) сделает наше обновление, или же, наш update заблокирует tbl1 и сразу обновит в ней поля, затем разблокирует и перейдет к ожиданию блокировки на tbl2 и т.д.? А если в update будут таблицы в списке связанные по JOIN, то в этом случае как блокировки происходят, так же как и без JOIN?
2. К сожалению, MySql при Update нескольких таблиц не гарантирует что присвоения будут выполнены слева напрво, т.е.
update tbl1,tbl2,tbl3 set tbl1.column1=tbl1.column1+tbl2.column1,tbl3.column1=tbl2.column1,tbl2.column1=0 where ...
Т.е. этим апдейтом я хотел сначала прибавить tbl2.column1, затем приравнять tbl2.column1 и только потом занулить. Но раз MySql не гарантирует такое последовательное выполнение, то вероятно когда то может выполниться сначала зануление а потом все остальные.
Не знаете, это вероятно связано с анализатором запроса и то в какой последовательности ему удобно обновлять? или может это связано как раз с блокировками из первого вопроса, типа какую первую заняли ту и апдейтим?
И можно ли, зная как работает анализатор запросов, выстроить Update нескольких таблиц так, чтобы последовательность сохранилась и зануление tbl2.column1=0 выполнилось именно последним?
Заранее Большое Спасибо за ответы, они очень помогут!
Неактивен
1. Должен блокировать на записи таблицы, в которые запись и на чтение таблицы, из которых только чтение. Но на эту тему были баги - см. http://bugs.mysql.com/bug.php?id=4118
Лучше протестировать - метод тестирования описан в баге (блокируете таблицу перед update).
2. Вы можете протестировать или прочитать исходный код mysql, чтобы узнать как работает оптимизатор. Но если нет гарантии, то писать так приложение нельзя - все будет иначе в другой версии.
Неактивен