powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Уникальный номер (нестандартный autoincrement), нужен совет
25 сообщений из 43, страница 1 из 2
Уникальный номер (нестандартный autoincrement), нужен совет
    #36515045
myproga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно реализовать запрос для сохранения записи в таблице.
Причем не должно возникать конфликтных ситуаций под нагрузкой.

Формат таблицы:
cat | id | data...

(`cat`, `id`) - уникальный ключ.

Например, в таблице такие данные:

1 | 1 | data...
1 | 2 | data...
1 | 3 | data...
1 | 4 | data...
1 | 5 | data...
2 | 1 | data...
3 | 1 | data...
3 | 2 | data...

В момент сохранения известен только `cat` , а `id` должен быть получен следующий для данного `cat`.

При использовании подзапроса, например, (SELECT max(id) WHERE cat=3) нет гарантий, что не будет конфликта, если одновременно будет выполняться несколько INSERTов разных пользователей. Предполагается, что одновременно может выполняться множество таких запросов :)

Есть ли более оптимальное решение этой проблемы?
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36515101
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
myproga,

1. серилизовать доступ к раздатчику ИД -- например сериализе в жаве

2. предпологаю (неплохо бы доказать) что такой вариант будет атомарно-безопасным:

insert into ABC
values (new_val1, new_val2, (select max(id) from ABC where cat=CAT1) + 1)

если будет ругатся про мутируюшую таблицу, то сделать ето в подселекте

3. перестроить схему на использование сквозной нумерации и
добавить неосновное поле для порадка внутри категории.
Ето поле можно будет подзаполнять потом , например ночью без нагрузки.
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36515114
RXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
myproga,

Код: plaintext
1.
2.
3.
4.
  cat INT NOT NULL,
  id INT NOT NULL AUTO_ICREMENT,

  PRIMARY KEY (cat, id)

При вставке NULL в id будет выбрано следующее значение в соответствующей ветке бинарного дерева ключа PK.

Работает только с MYISAM!
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36515126
myproga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Работает только с MYISAM
А с InnoDB?

перестроить схему на использование сквозной нумерации
Только как крайняя мера, если решить иначе не удастся.

предпологаю (неплохо бы доказать) что такой вариант будет атомарно-безопасным
Собственно, меня безопасность подобного варианта (как я и писал в первом сообщении) и интересует, если нет более оптимальных решений.
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36515212
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
myprogaА с InnoDB?А с InnoDB это даже смысла не имеет, т.к. он транзакционный. Допустим в какой-то транзакции будет вставлена запись, после этого в других транзакциях будут вставлены и закоммичены еще несколько записей. А после этого, вдруг, первая транзакция откатывается. Спрашивается, что тогда делать? Апдейтить все более поздние записи?
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36515217
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
myproga,

нтуитивно бы хотелось чтоб етот вариант было атомарным:
надо внимательно перечитать здесь. Похоже что в последнем коменте
указано что табл1 лочится:

http://dev.mysql.com/doc/refman/5.1/en/concurrent-inserts.html
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36515219
myproga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

авторСпрашивается, что тогда делать? Апдейтить все более поздние записи?
При откате образуется пропуск в `id`. Ничего обновлять не надо, как и при использовании стандартного autoincrementа.
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36515226
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
myprogamiksoft,

авторСпрашивается, что тогда делать? Апдейтить все более поздние записи?
При откате образуется пропуск в `id`. Ничего обновлять не надо, как и при использовании стандартного autoincrementа.А тогда какой вообще смысл в этом поле?
Используйте штатный AUTO_ICREMENT и считайте что у него просто много пропусков.
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36515252
myproga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А тогда какой вообще смысл в этом поле?
Используйте штатный AUTO_ICREMENT и считайте что у него просто много пропусков.
Смысл - в инкрементации `id` начиная с 1 для каждого `cat`.
Важен порядковый номер добавленного элемента для конкретного `cat`.
Это имеет значение, иначе бы я не писал.

javajdbc,
По ссылке про MYISAM...
Там про insert select из разных таблиц, но теоретически должно так работать и в этом случае.
Но пока нет достоверного подтверждения, к сожалению.
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36515260
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
myprogaСмысл - в инкрементации `id` начиная с 1 для каждого `cat`.Транзакция с единицой так же может откатиться.
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36515277
myproga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Транзакция с единицой так же может откатиться.
Все это конечно не очень хорошо, но вероятность отката очень низкая .
К тому же, любой из добавленных элементов может быть удален в будущем .
Если где-то и будет несколько пропусков, то ничего "очень страшного" не случится.

Меня больше волнует безопасность одновременного добавления. Достоверной информации о том, не будет ли такого случая, пока нет.
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36515288
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
myprogaМеня больше волнует безопасность одновременного добавления. Достоверной информации о том, не будет ли такого случая, пока нет.Наложите на эти два поля уникальный индекс и ловите в клиенте исключение. Как поймаете - прибавляйте единицу, подождите случайное время и вставляйте снова. И так по кругу, пока либо не произойдет успешная вставка, либо не исчерапается количество попыток/время.

А еще можно блокировать всю таблицу, но это слишком банальный способ :)
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36515296
myproga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Наложите на эти два поля уникальный индекс и ловите в клиенте исключение. Как поймаете - прибавляйте единицу, подождите случайное время и вставляйте снова. И так по кругу, пока либо не произойдет успешная вставка, либо не исчерапается количество попыток/время.
А еще можно блокировать всю таблицу
Очень нерациональные способы :)


Тогда мне проще использовать MYISAM и написать примитивную поддержку транзакций :D
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36515307
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
myprogaТогда мне проще ... написать примитивную поддержку транзакций :DЭто вы сильно заблуждаетесь.
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36515316
myproga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Это вы сильно заблуждаетесь.
Может быть, но в эту тему не вникал пока и, думаю, не придется :)
Должно быть какое-то простое решение.
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36515386
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
myproga,

Думается мне, что средствами MySQL и без общей точки блокировки желаемое не реализуемо.
Придется либо использовать внешние средства, либо идти на какой-то компромисс.
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36515804
RXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
myproga,

Я тут задумывал серию статей на тему эмуляции SEQUENCE в MySQL, но по лени оно осталось в недоделанном состоянии - написал только две части из 4-х. Но зато рассмотрел, как работает Innodb со счетчиками в таблицах (попытка сделать подобие вышеописанной фичи MYISAM). Если интересно, то можно ознакомиться здесь:
Эмуляция SEQUENCE. / На базе INNODB и транзакций.
_
Недостатки:

* Другие сессии, которые будут работать с этой строкой, заблокируются в вызове nextval.
* Другие сессии, использующие режим изоляции READ COMMITTED, не будут видеть наших изменений до завершения нашей транзакции, но и не будут блокироваться, и вызов nextval вернет то же самое значение, что и в нашей сессии.

Т.е., все пользователи нашего генератора последовательностей должны работать в режиме REPEATABLE READ. В режиме READ COMMITTED наша конструкция неработоспособна совсем.


Если совсем лениво читать, то скажу, что с транзакционными базами такие конструкции лучше не делать - ненадежно, а то и неработоспособно.
Кстати, от пропусков это тоже не избавит. Т.ч. единственно верно - использовать id по назначению - как id, а не как порядковый номер.
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36516502
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RXL,
вот здесь тоже задумывались...
там в комментах интересные мысли насчет

1. ALTER TABLE
2.INSERT/DELETE where WHERE s.name = p_name; (как раз если использовать фичу MyIsam указанную выше)
Короче - есть плацдарм для экпериментов, все надо тестировать
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36516533
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_UstinovRXL,
вот здесь тоже задумывались...
там в комментах интересные мысли насчет

1. ALTER TABLE
2.INSERT/DELETE where WHERE s.name = p_name; (как раз если использовать фичу MyIsam указанную выше)
Короче - есть плацдарм для экпериментов, все надо тестироватьМожете поподробнее описать, что вы там разглядели полезного для топикстартера?
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36516892
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я отвечал RXL по поводу его ссылки.

сразу оговорюсь - сам не экпериментировал.
Идея навскидку такова (если у ТС InnoDB):

создать таблицу-клон MyIsam с primary(cat,id) и доставать id из нее (так как в InnoDB невозможно создать составной PRIMARY)
INSERT
SELECT Last_Insert_Id().
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36516912
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_UstinovИдея навскидку такова (если у ТС InnoDB):

создать таблицу-клон MyIsam с primary(cat,id) и доставать id из нее (так как в InnoDB невозможно создать составной PRIMARY)
INSERT
SELECT Last_Insert_Id().Это будет общая точка блокировки. Имхо, ничем не лучше просто блокировки исходной таблицы.
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36516960
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
исходя из топиков ТС выше - речь о InnoDB, для МайИСАМ путь указали. Вот чтобы на клиенте не прибавлять +1 - можно таким макаром генерить для InnoDB.
И по сути вопроса. Вы думаете что SEQUENCE в DB2-Oracle-PostgeSQL не тормозят INSERT? Или AUTO_INCREMENT работает без блокировки "самого себя". Дыма без огня не бывает.
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36516995
RXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если мы заговорили об Innodb, то не будем забывать про implicit commit!
По этой причине отпадает и DDL (ALTER TABLE), и LOCK TABLE.

Можно попробовать блокировки с функциями GET_LOCK/RELEASE_LOCK и хранить счетчики в MYISAM табличке.
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36517031
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RXLЕсли мы заговорили об Innodb, то не будем забывать про implicit commit!
По этой причине отпадает и DDL (ALTER TABLE), и LOCK TABLE.LOCK TABLE не совсем отпадает, его можно вынести в начало транзакции.
...
Рейтинг: 0 / 0
Уникальный номер (нестандартный autoincrement), нужен совет
    #36517120
RXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Что делает решение еще менее универсальным и повышает вероятность появления трудно находимых ошибок.
...
Рейтинг: 0 / 0
25 сообщений из 43, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Уникальный номер (нестандартный autoincrement), нужен совет
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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