powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
14 сообщений из 14, страница 1 из 1
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
    #39795702
grungestranger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Интересует тема про блокировки mysql. Многие высказываются, что LOCK TABLES это самое большое зло.

Как обойтись без LOCK TABLES в таком случае:

Таблица comments , поля user_id , comment .
У юзера может быть не более, например, 5-ти комментариев.

Чтобы сохранить комментарий, нужно сначала считать количество комментариев данного юзера, если оно не больше 4 — записываем, иначе нет.

В это время нельзя, чтобы другая транзакция могла считать количество комментариев данного юзера, так как если она получит значение не больше 4, то потом будет записывать. И получится, что запишется больше чем нужно (и я запишу и другая транзакция запишет).

То есть нельзя, чтобы другая транзакция могла читать (и писать) всю таблицу с момента, как я начал читать, до момента, как я запишу.

Я не вижу здесь варианта, кроме как LOCK TABLES.
...
Рейтинг: 0 / 0
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
    #39795707
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант - табличка из 5 записей, а в основной таблице уникальный внешний ключ на нее.
...
Рейтинг: 0 / 0
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
    #39795721
grungestranger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftКак вариант - табличка из 5 записей, а в основной таблице уникальный внешний ключ на нее.

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

И результат этого условия поменяется, если эта транзакция запишет данные.
(как в нашем примере, если мы запишем 5-й комментарий, то больше записывать нельзя)

Поэтому нельзя дать другим транзакциям ни читать ни писать, пока не выполнится данная транзакция.
...
Рейтинг: 0 / 0
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
    #39795729
grungestranger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftКак вариант - табличка из 5 записей, а в основной таблице уникальный внешний ключ на нее.

К тому же (как понимаю, вы предлагаете создать таблицу с пятью полями для комментариев, типа: comment1, comment2, ...) это не серьезно, если я это число - 5 захочу изменить, мне придется таблицу изменять...
...
Рейтинг: 0 / 0
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
    #39795823
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grungestrangermiksoftКак вариант - табличка из 5 записей, а в основной таблице уникальный внешний ключ на нее.

К тому же (как понимаю, вы предлагаете создать таблицу с пятью полями для комментариев, типа: comment1, comment2, ...) это не серьезно, если я это число - 5 захочу изменить, мне придется таблицу изменять...нет, про 5 полей я ничего не предлагал, не придумывайте.
...
Рейтинг: 0 / 0
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
    #39795842
grungestranger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftgrungestrangerпропущено...


К тому же (как понимаю, вы предлагаете создать таблицу с пятью полями для комментариев, типа: comment1, comment2, ...) это не серьезно, если я это число - 5 захочу изменить, мне придется таблицу изменять...нет, про 5 полей я ничего не предлагал, не придумывайте.

Аа, ну значит, я просто не понимаю, что значит - таблица с пятью записями.
...
Рейтинг: 0 / 0
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
    #39796095
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grungestrangerЧтобы сохранить комментарий, нужно сначала считать количество комментариев данного юзера, если оно не больше 4 — записываем, иначе нет.То есть, комментарий будет отброшен? Лехко.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE comments ( user_id INT NOT NULL,
                        comment TEXT,
                        commentnum ENUM('1','2','3','4','5') ); -- значения пофиг, важно количество

CREATE TRIGGER deny_6th_comment
BEFORE INSERT
ON comments
FOR EACH ROW
SET NEW.commentnum := (SELECT 1+MAX(commentnum) 
                       FROM comments
                       WHERE user_id = comments.user_id); 
...
Рейтинг: 0 / 0
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
    #39796101
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку поле commentnum формально скрыто от приложения - оно работает нормально. Если же какая-то сволочь может полезть в данные грязными руками - дополнительно
Код: sql
1.
CREATE UNIQUE INDEX idx_userid_commentnum ON comments (user_id, commentnum);
...
Рейтинг: 0 / 0
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
    #39796111
H5N1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Считывай кол-во колво коментариев в юзерс таблице через select for update
Такой селект поставит row level lock и выстроит твоих коментаторов в очередь. Только автокомит вырубить не забудь
...
Рейтинг: 0 / 0
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
    #39796295
grungestranger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
H5N1Считывай кол-во колво коментариев в юзерс таблице через select for update
Такой селект поставит row level lock и выстроит твоих коментаторов в очередь. Только автокомит вырубить не забудь

Ну а если нет ни одного комментария, то что будет заблокировано? Сможет ли параллельная транзакция тоже получить результат, что нет ни одного комментария?
...
Рейтинг: 0 / 0
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
    #39796302
grungestranger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinagrungestrangerЧтобы сохранить комментарий, нужно сначала считать количество комментариев данного юзера, если оно не больше 4 — записываем, иначе нет.То есть, комментарий будет отброшен? Лехко.

Код: sql
1.
2.
3.
...
                        commentnum ENUM('1','2','3','4','5') ); -- значения пофиг, важно количество
...



Ну а если лимит будет 1000 штук.... очевидно, что такое решение не подходит.
...
Рейтинг: 0 / 0
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
    #39796454
H5N1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grungestrangerH5N1Считывай кол-во колво коментариев в юзерс таблице через select for update
Такой селект поставит row level lock и выстроит твоих коментаторов в очередь. Только автокомит вырубить не забудь

Ну а если нет ни одного комментария, то что будет заблокировано? Сможет ли параллельная транзакция тоже получить результат, что нет ни одного комментария?

заблокирована будет строка из таблицы users (или куда там у тебя comments.user_id ссылется). юзер то обязан быть не зависимо от того что в коментах.
параллельная транзакция будет ждать завершения конкурирующего select for update на того же юзера. то что тебе и нужо. подсчеты на разных юзеров выстраиваться в очередь не будут, а вот на одного и того же выстроятся в очередь и будут ждать снятия блокировки со строки из users таблицы.
...
Рейтинг: 0 / 0
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
    #39796458
H5N1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
H5N1заблокирована будет строка из таблицы users (или куда там у тебя comments.user_id ссылется). юзер то обязан быть не зависимо от того что в коментах.
параллельная транзакция будет ждать завершения конкурирующего select for update на того же юзера. то что тебе и нужо. подсчеты на разных юзеров выстраиваться в очередь не будут, а вот на одного и того же выстроятся в очередь и будут ждать снятия блокировки со строки из users таблицы.
только после select for update транзакция должна продолжаться, что бы блокировка стояла до окончания подсчета по комента
...
Рейтинг: 0 / 0
Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
    #39796475
grungestranger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
H5N1,

Ну да, с таким подходом в данной ситуации я согласен.
Надо попробовать (конечно, пример с комментами выдуман, но можно попробовать применить там, где действительно нужно).
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Когда можно использовать явные блокировки (LOCK TABLES) на движке InnoDB ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]