
Yaroslav
17.09.2017
12:21:46

lost
17.09.2017
12:23:20

Zaur
17.09.2017
12:23:27

Alexey
17.09.2017
12:25:48

Google

lost
17.09.2017
12:26:20
это не бред, это документация)

Alexey
17.09.2017
12:26:52
это какая-то документация из параллельной вселенной

lost
17.09.2017
12:26:54
и никакой индекс не нужен
это какая-то документация из параллельной вселенной
Record locks always lock index records, even if a table is defined with no indexes. For such cases, InnoDB creates a hidden clustered index and uses this index for record locking. Если у тебя будет тип доступа ALL сколько строк ты заблокируешь?

Alexey
17.09.2017
12:28:30
ой, так ну это ж не о том совсем

lost
17.09.2017
12:28:44
а о чем же?

Alexey
17.09.2017
12:29:40
о том, что если таблица определена без индексов, то создаётся скрытый clustered index из row id

lost
17.09.2017
12:29:58
Если у тебя будет тип доступа ALL сколько строк ты заблокируешь?
даже по кластерному индексу
Проведи простой эксперимент:
START TRANSACTION;
SELECT
*
FROM foo f
WHERE f.entity <> 1 FOR UPDATE;
COMMIT;
START TRANSACTION;
SELECT
*
FROM foo f
WHERE f.id = 2 FOR UPDATE;
COMMIT;
выполни две транзакции параллельно
с условием что в первой транзакции выборка идет по колонке, на которой нет индекса
а во второй выборка по праймари

Google

lost
17.09.2017
12:35:13
конструкция FOR UPDATE даёт тот же лок что и UPDATE и DELETE

Alexey
17.09.2017
12:42:13
ох щщи
значит UPDATE на таблице на 9 миллионов записей поставит record (не next-key) локи на все обновляемые записи. это независимо от того, какой индекс используется (и используется ли вообще)
да, параллельным update-ам на те записи, которые уже были заблокированы, придётся подождать
это однако не имеет ничего общего с блокировкой таблиц. особенно в случае insert (append-only) запросов — они вообще никаких блокировок не увидят

Zaur
17.09.2017
12:44:52
паралельных апдейтов не будет, приложение в эту таблицу только добавляте новые строки и все

lost
17.09.2017
12:44:57

Alexey
17.09.2017
12:45:11
да. но нет

lost
17.09.2017
12:45:35
есть такая штука как блокировка автоинкремента, например

Alexey
17.09.2017
12:46:22
есть, да. не про нас это

lost
17.09.2017
12:48:34
потом вместе посмеемся)

Alexey
17.09.2017
12:50:01
да я как бы и не смеюсь. в какой второй транзакции?

lost
17.09.2017
12:50:11

Alexey
17.09.2017
12:51:01
так там две транзакции делают SELECT FOR UPDATE на всю таблицу. это вообще каким боком здесь?

lost
17.09.2017
12:51:18
во первых не на всю

Alexey
17.09.2017
12:51:35
можно было просто сделать select get_lock() и сказать: "вот, видишь, блокировки!"

lost
17.09.2017
12:51:47
@etkee ты удачно зашел, присоединяйся, бери попкорн

Alexey
17.09.2017
12:51:50
ну, там пример подобран так, чтобы их заблокировать

lost
17.09.2017
12:52:01

Google

Alexey
17.09.2017
12:52:17
так и пример ничего общего не имеет

Fike
17.09.2017
12:52:24
да я давно смотрю и ничего не понимаю, не спал слегка. потому и попытался stackoverflow здесь набрать.

lost
17.09.2017
12:52:25
Почему же?

Alexey
17.09.2017
12:52:47
а почему же имеют?

lost
17.09.2017
12:52:51
точно такую же
как и при блокировке апдейтом

Alexey
17.09.2017
12:53:19
ну круто. я предложил более короткий вариент "блокировки всей таблицы"
ну, во-первых она не точно такая же. подумай про isolation levels, например

lost
17.09.2017
12:54:08

Alexey
17.09.2017
12:55:19
а во-вторых, даже в твоём примере блокировки таблицы нет. оно к конце выполнения заблокирует все записи. ну круто, да. и это доказывает, что UPDATE на всю таблицу всю таблицу же и заблокирует?

lost
17.09.2017
12:55:59
а, то есть все записи таблицы это не вся таблица да?
сложный прикол

Yaroslav
17.09.2017
12:56:33
а если вся таблица, то insert незя

lost
17.09.2017
12:56:53
попробуй во второй транзакции заменить селект на вставку

Yaroslav
17.09.2017
12:57:30
так ты лочишь всю таблицу
специально через for update

Alexey
17.09.2017
12:57:39
а update может выполняться минутами и часами. и чем дольше он выполняется, тем разница между "заблокированы обновлённые записи" и "заблокирована вся таблица" становится очевиднее

Google

lost
17.09.2017
12:58:12
Блин, ребят, смысла спорить нет, потратьте 5 минут своего драгоценного времени, проверьте

Alexey
17.09.2017
12:58:24
а, ну ok

Yaroslav
17.09.2017
12:58:39
никто не спорит
уже спор о названиях

Alexey
17.09.2017
12:59:27
не даст выполнить именно из-за for update кстати

Yaroslav
17.09.2017
12:59:53

Alexey
17.09.2017
13:00:14
@acromegale слушай, у меня мысль возникла. а вы с @etkee не бадушники случайно?

lost
17.09.2017
13:00:23

Fike
17.09.2017
13:00:27
вот это прям оскорбление века было

Alexey
17.09.2017
13:00:39
ok. да нет, я просто подумал, ничего лично :)

Fike
17.09.2017
13:00:49
да я не серьезно

lost
17.09.2017
13:01:19

Fike
17.09.2017
13:01:26
но в дейтинг вообще никогда не пойду, как и в продажу спиннеров, вейпов, казино, мфо, бинарные опционы и прочие эм вакансии

Alexey
17.09.2017
13:03:34

lost
17.09.2017
13:04:28
и да, кстати

Alexey
17.09.2017
13:04:56
да даже растяни свой собственный пример на 9 миллионов строк. потом прикинь, какую часть времени будут заблокированы insert-ы

lost
17.09.2017
13:05:00
разговор был за обновление по колонке без индекса

Alexey
17.09.2017
13:05:16
а это всё равно. ну будет индекс, и что?

Google

lost
17.09.2017
13:06:14
будет индекс - будут заблокированы только записи по этому индексу, которые подходят по условию
без индекса будет фулл тейбл
блин, мне уже чесслово надоело

Alexey
17.09.2017
13:06:38
какому условию? мы про full-table update говорим

lost
17.09.2017
13:08:12
Обновление всей таблицы или обновление n строк по неиндексной колонке одинаково блокирует все записи
сколько раз я еще это должен сказать
чтобы вы поняли

Alexey
17.09.2017
13:10:55
да мы поняли. но мой вопрос без ответа остался

lost
17.09.2017
13:11:02
какой именно

Alexey
17.09.2017
13:11:30
или вот ещё вопрос на засыпу: может ли update по неиндексной колонке использовать индекс?
какой именно
какому условию? мы про full-table update говорим
вот этот

lost
17.09.2017
13:12:55

Alexey
17.09.2017
13:15:17

lost
17.09.2017
13:15:41
Хорошо, давай верный

Alexey
17.09.2017
13:36:24
правильный ответ: UPDATE может использовать любой доступный индекс (или не использовать вообще) на усмотрение оптимизатора. для блокировок строк pimary key не требуется

lost
17.09.2017
13:38:02
Хорошо, что тогда используется для блокировки строки если нет индекса ?

Alexey
17.09.2017
13:48:20

Muzaffar
17.09.2017
16:30:29
мужики какими IDE пользуетесь под линукс?
есть ли IDE на подобие dbForge под линукс?