Я пишу небольшое программное обеспечение, которое должно вставлять записи в базу данных, используемую коммерческим приложением. Уникальные первичные ключи (ids) в соответствующей таблице (таблицах) являются последовательными, но, похоже, не настроены на «auto increment». Таким образом, я предполагаю, что мне нужно будет найти самый большой идентификатор, увеличить его и использовать это значение для записи, которую я вставляю.Уровень изоляции транзакции, необходимый для безопасного увеличения идентификаторов
В псевдокоде для краткости:
id = select max(id) from some_table
id++
insert into some_table values(id, othervalues...)
Теперь, если другой поток начал ту же транзакцию перед первым закончил свою вставку, вы получите два одинаковых идентификаторов и сбой при попытке вставить последний один. Вы можете проверить этот отказ и повторить попытку, но более простым решением может быть установка уровня изоляции транзакции. Для этого мне нужен SERIALIZABLE или более низкий уровень?
Кроме того, это, как правило, правильный способ решения проблемы? Есть ли другие способы сделать это?
Ваше первое предложение кажется самым простым решением. Являются ли эти утверждения атомными и, следовательно, абсолютно потокобезопасными? –
Я не уверен, что ваше редактирование имело смысл ...? По крайней мере, я не понимаю синтаксис ... и работала первая версия. :) –
Подкатил его обратно и включил оба, так как первая версия работала для вас :) –