|
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
|
|||
---|---|---|---|
#18+
Добрый день. Интересует тема про блокировки mysql. Многие высказываются, что LOCK TABLES это самое большое зло. Как обойтись без LOCK TABLES в таком случае: Таблица comments , поля user_id , comment . У юзера может быть не более, например, 5-ти комментариев. Чтобы сохранить комментарий, нужно сначала считать количество комментариев данного юзера, если оно не больше 4 — записываем, иначе нет. В это время нельзя, чтобы другая транзакция могла считать количество комментариев данного юзера, так как если она получит значение не больше 4, то потом будет записывать. И получится, что запишется больше чем нужно (и я запишу и другая транзакция запишет). То есть нельзя, чтобы другая транзакция могла читать (и писать) всю таблицу с момента, как я начал читать, до момента, как я запишу. Я не вижу здесь варианта, кроме как LOCK TABLES. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2019, 12:10 |
|
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
|
|||
---|---|---|---|
#18+
Как вариант - табличка из 5 записей, а в основной таблице уникальный внешний ключ на нее. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2019, 12:17 |
|
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
|
|||
---|---|---|---|
#18+
miksoftКак вариант - табличка из 5 записей, а в основной таблице уникальный внешний ключ на нее. Ну данный пример вымышленный, речь идет о том, что бывают случаи, когда запись должна производиться по какому-то условию, которое читается из базы (потом может как-то обрабатываться)... И результат этого условия поменяется, если эта транзакция запишет данные. (как в нашем примере, если мы запишем 5-й комментарий, то больше записывать нельзя) Поэтому нельзя дать другим транзакциям ни читать ни писать, пока не выполнится данная транзакция. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2019, 12:36 |
|
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
|
|||
---|---|---|---|
#18+
miksoftКак вариант - табличка из 5 записей, а в основной таблице уникальный внешний ключ на нее. К тому же (как понимаю, вы предлагаете создать таблицу с пятью полями для комментариев, типа: comment1, comment2, ...) это не серьезно, если я это число - 5 захочу изменить, мне придется таблицу изменять... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2019, 12:43 |
|
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
|
|||
---|---|---|---|
#18+
grungestrangermiksoftКак вариант - табличка из 5 записей, а в основной таблице уникальный внешний ключ на нее. К тому же (как понимаю, вы предлагаете создать таблицу с пятью полями для комментариев, типа: comment1, comment2, ...) это не серьезно, если я это число - 5 захочу изменить, мне придется таблицу изменять...нет, про 5 полей я ничего не предлагал, не придумывайте. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2019, 14:14 |
|
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
|
|||
---|---|---|---|
#18+
miksoftgrungestrangerпропущено... К тому же (как понимаю, вы предлагаете создать таблицу с пятью полями для комментариев, типа: comment1, comment2, ...) это не серьезно, если я это число - 5 захочу изменить, мне придется таблицу изменять...нет, про 5 полей я ничего не предлагал, не придумывайте. Аа, ну значит, я просто не понимаю, что значит - таблица с пятью записями. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2019, 14:33 |
|
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
|
|||
---|---|---|---|
#18+
grungestrangerЧтобы сохранить комментарий, нужно сначала считать количество комментариев данного юзера, если оно не больше 4 — записываем, иначе нет.То есть, комментарий будет отброшен? Лехко. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2019, 08:29 |
|
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
|
|||
---|---|---|---|
#18+
Поскольку поле commentnum формально скрыто от приложения - оно работает нормально. Если же какая-то сволочь может полезть в данные грязными руками - дополнительно Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2019, 08:33 |
|
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
|
|||
---|---|---|---|
#18+
Считывай кол-во колво коментариев в юзерс таблице через select for update Такой селект поставит row level lock и выстроит твоих коментаторов в очередь. Только автокомит вырубить не забудь ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2019, 08:46 |
|
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
|
|||
---|---|---|---|
#18+
H5N1Считывай кол-во колво коментариев в юзерс таблице через select for update Такой селект поставит row level lock и выстроит твоих коментаторов в очередь. Только автокомит вырубить не забудь Ну а если нет ни одного комментария, то что будет заблокировано? Сможет ли параллельная транзакция тоже получить результат, что нет ни одного комментария? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2019, 11:30 |
|
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
|
|||
---|---|---|---|
#18+
AkinagrungestrangerЧтобы сохранить комментарий, нужно сначала считать количество комментариев данного юзера, если оно не больше 4 — записываем, иначе нет.То есть, комментарий будет отброшен? Лехко. Код: sql 1. 2. 3.
Ну а если лимит будет 1000 штук.... очевидно, что такое решение не подходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2019, 11:39 |
|
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
|
|||
---|---|---|---|
#18+
grungestrangerH5N1Считывай кол-во колво коментариев в юзерс таблице через select for update Такой селект поставит row level lock и выстроит твоих коментаторов в очередь. Только автокомит вырубить не забудь Ну а если нет ни одного комментария, то что будет заблокировано? Сможет ли параллельная транзакция тоже получить результат, что нет ни одного комментария? заблокирована будет строка из таблицы users (или куда там у тебя comments.user_id ссылется). юзер то обязан быть не зависимо от того что в коментах. параллельная транзакция будет ждать завершения конкурирующего select for update на того же юзера. то что тебе и нужо. подсчеты на разных юзеров выстраиваться в очередь не будут, а вот на одного и того же выстроятся в очередь и будут ждать снятия блокировки со строки из users таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2019, 13:56 |
|
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
|
|||
---|---|---|---|
#18+
H5N1заблокирована будет строка из таблицы users (или куда там у тебя comments.user_id ссылется). юзер то обязан быть не зависимо от того что в коментах. параллельная транзакция будет ждать завершения конкурирующего select for update на того же юзера. то что тебе и нужо. подсчеты на разных юзеров выстраиваться в очередь не будут, а вот на одного и того же выстроятся в очередь и будут ждать снятия блокировки со строки из users таблицы. только после select for update транзакция должна продолжаться, что бы блокировка стояла до окончания подсчета по комента ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2019, 14:00 |
|
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
|
|||
---|---|---|---|
#18+
H5N1, Ну да, с таким подходом в данной ситуации я согласен. Надо попробовать (конечно, пример с комментами выдуман, но можно попробовать применить там, где действительно нужно). ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2019, 14:11 |
|
|
start [/forum/topic.php?fid=47&msg=39795842&tid=1829206]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
67ms |
get topic data: |
17ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 174ms |
0 / 0 |