powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Эмуляция autoincrement + паралельные запросы
10 сообщений из 10, страница 1 из 1
Эмуляция autoincrement + паралельные запросы
    #37059921
Рубик3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица с записями, упрощенно такая:
id (primary, autoincrement)
group_id (int)
data

Нужно группировать записи по полю group_id. То есть, если при вставке group_id не указан, брать максимальное его значение и увеличивать на единицу. Это будет означать создание новой группы.
Все кажется нормальным, кроме возможной проблемы с паралельными запросами. Т.е. если два запроса попытаются сделать выборку максимального значения + вставку, то возможно дублирование group_id для не связанных записей, что недопустимо. Даже если использовать транзакцию, где соединить выборку максимального значения group_id и вставку записи с group_id+1, то прийдется блокировать часть строк, что при паралельных транзакциях вернет ошибку для второй транхакции. А этого нужно июеждать.

Очевидный вариант с введением дополнительной таблицы не желателен, так как таблиц такого плана в БД очень много и не хотелось бы захламлять ее кучей таблиц с одними только primary key, да и выборку предпочтительнее делать из одной. Надеюсь, я понятно все объяснил.

Используется MySQL InnoDB, но теоретически база можен быть перенесена в другую СУБД.
...
Рейтинг: 0 / 0
Эмуляция autoincrement + паралельные запросы
    #37060011
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А по какому принципу происходит вставка полей с одинаковым group_id? Т.е. откуда происходит информация о том, что какие-то записи от носятся к одной группе?
...
Рейтинг: 0 / 0
Эмуляция autoincrement + паралельные запросы
    #37060203
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftА по какому принципу происходит вставка полей с одинаковым group_id? Т.е. откуда происходит информация о том, что какие-то записи от носятся к одной группе?
Этот справедливый вопрос основан, вероятно, на вот этом предложении из исходного сообщения:
"Т.е. если два запроса попытаются сделать выборку максимального значения + вставку, то возможно дублирование group_id для не связанных записей, что недопустимо ."
...
Рейтинг: 0 / 0
Эмуляция autoincrement + паралельные запросы
    #37060206
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рубик3 Очевидный вариант с введением дополнительной таблицы не желателен, так как таблиц такого плана в БД очень много и не хотелось бы захламлять ее кучей таблиц с одними только primary key, да и выборку предпочтительнее делать из одной.
Во-первых, зачем "куча"? Вам принципиально, будет у Вас 1,2,3 или 1,3,6? (Правда конкуренция возрастает для извлечения этой мифической группы).
Во-вторых, это же одно удовольствие использовать очевидный вариант:) Почему "захламлять" БД "записями" можно, а "таблицами" нельзя?
...
Рейтинг: 0 / 0
Эмуляция autoincrement + паралельные запросы
    #37060597
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рубик3то прийдется блокировать часть строк, что при паралельных транзакциях вернет ошибку для второй транхакции.
Уверены? Обычным и общепринятым поведением в этом случае является ожидание второй транзакцией снятия блокировки.

А вообще без блокировок, явных или неявных, либо без применения сугубо специфичных механизмов эта задача не решается.
...
Рейтинг: 0 / 0
Эмуляция autoincrement + паралельные запросы
    #37061033
Рубик3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторА по какому принципу происходит вставка полей с одинаковым group_id? Т.е. откуда происходит информация о том, что какие-то записи от носятся к одной группе?
Эта система для хранения истории изменений записей. То есть group_id - это одна запись, для которой есть несколько версий из которых только одна актуальная.
Когда добавляется новая запись - добавляется строка с новым group_id, когда запись изменяется - добавляется строка с
существующим group_id.

авторВо-первых, зачем "куча"?
Будет применено для многих таблиц, не считал точно сколько, но не меньше 10.

авторВо-вторых, это же одно удовольствие использовать очевидный вариант:) Почему "захламлять" БД "записями" можно, а "таблицами" нельзя?
Да вообщем-то не хочется захламлять не записями не таблицами :) А еще очень не хочется это все потом переделывать, если всплывет более красивое решение :)

авторУверены? Обычным и общепринятым поведением в этом случае является ожидание второй транзакцией снятия блокировки.
Не уверен :) Но блокировки, тоже, не желательны, так как может быть автоматическое добавление большого числа записей, да и вообще, блокировки - куча лишних проблем с производительностью. Видимо придется все-таки делать дополнительные таблицы.
...
Рейтинг: 0 / 0
Эмуляция autoincrement + паралельные запросы
    #37061085
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рубик3 Будет применено для многих таблиц, не считал точно сколько, но не меньше 10.
Опять Вы про каких-то "много таблиц":) Я же говорю, что таблица может быть одна. Еще раз: Вам принципиально, будет у Вас group_id в конкретной "таблице с записями" 1,2,3 или 1,3,6?
...
Рейтинг: 0 / 0
Эмуляция autoincrement + паралельные запросы
    #37061089
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рубик3 Видимо придется все-таки делать дополнительные таблицы.
А может быть таблицУ, а не таблицЫ:)
В которой можно хранить ОДНУ ЗАПИСЬ.
Все зависит от реальной нагрузки.
Одна таблица с одним атрибутом и одной записью. Вот и весь хлам:)
...
Рейтинг: 0 / 0
Эмуляция autoincrement + паралельные запросы
    #37061097
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рубик3 Но блокировки, тоже, не желательны, так как может быть автоматическое добавление большого числа записей, да и вообще, блокировки - куча лишних проблем с производительностью. Видимо придется все-таки делать дополнительные таблицы.
Блокировки при извлечении значения "идентификатора группы" все равно будут. В решении с одной таблицей, одним атрибутом и одной записью нет никаких "ключей", что, может быть, повысит производительность.
...
Рейтинг: 0 / 0
Эмуляция autoincrement + паралельные запросы
    #37062856
Рубик3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
БредятинаОпять Вы про каких-то "много таблиц":) Я же говорю, что таблица может быть одна. Еще раз: Вам принципиально, будет у Вас group_id в конкретной "таблице с записями" 1,2,3 или 1,3,6?
Это, конечно чуть быстрее, чем определять максимальное значение group_id, но в целом не решает проблему - нужны те же транзакции, блокировки. Хотя, одна лишняя таблица лучше 10-ти, но это не добавляет понятности. С третьей таблицей, где одно поле-ключ с заполнением group_id как-то логичнее и может даже в некоторых случаях будет что туда сунуть дополнительно.

БредятинаБлокировки при извлечении значения "идентификатора группы" все равно будут. В решении с одной таблицей, одним атрибутом и одной записью нет никаких "ключей", что, может быть, повысит производительность.
Вставка с автоинкрементом все-равно будет быстрее чем транзакция на select и udate с блокировкой, пусть даже в очень маленькой таблице. Какие-то блокировки есть, конечно, и на автоинкремент, но мне кажется, что они значительно более оптимизированы, чем такие транзакции и все-таки позволяют выполнять параллельные insert-запросы.



В общем, я кажется уже принял решение, спасибо всем за ответы и разъяснения.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Эмуляция autoincrement + паралельные запросы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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