Про добавление записей в таблицы с автоинкрементными полями в случаях, …





... когда нужно знать значение этих автоинкрементных полей.

Вот блин, livejournal не разрешает делать темы сообщения длиннее ста символов...

Но речь не об этом.

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

OLE DB провайдер от Microsoft для их SQL-сервера вместе с библиотекой ADO предлагают простое, очевидное и неправильное решение. После выполнения функции ADO Update для записи изменений в базу колонки, соответствующие автоинкрементным полям, автоматически заполняются значениями, которые получились после инкремента. Обычно значения совпадают с теми, которые присвоились колонкам, но этого никто нигде не гарантирует. Более того. В профилере видно, что для заполнения этих колонок провайдер использует тупую функцию @@IDENTITY, которая возвращает значение последней автоувеличившейся identity-колонки. При нестрогой изоляции транзакций это может привести к тому, что значение колонки заполнится из совсем другого инкрементного поля. В базе получится каша.

Для решения проблемы сегодня пришла в голову простая мысль, которая настолько очевидна, что даже странно, почему я раньше до неё не додумался. Автоинкрементное поле надо заполнять руками. В postgresql даже можно узнать, какое следующее значение выдаст последовательность - объект, отвечающий за автоинкременты. Вот оттуда и надо брать значение и пытаться записать его в базу. Если не получилось - это означает, что вмешалась другая транзакция, и надо повторить - по-новой взять значение и по-новой попытаться записать. И так некоторое разумное количество раз. Остаётся только не забыть поправить sequence за собой. Тут то же самое. При обновлении может вмешаться другая транзакция. Это решается просто - при определении, какое значение задать автоинкрементному полю, надо не только узнать значение в sequence, но и проверить максимальное значение автоинкрементного поля в базе. через некоторое количество итераций устаканится. Как только хоть одна запись прошла успешно - всё, мы можем использовать этот ID. Совсем в идеале можно сделать случайные таймауты из диапазона, увеличивающегося с каждой коллизией, как в Ethernet.


Последние новости

Слово

Назови человека свиньей, и он захрюкает. Пословица Проживая данную нам жизнь, мы все время находимся в гуще энергий, как положительных, так и отрицательных. По этическим нормам слово обладает определенной силой, следовательно, когда мы клевещем на человека, судим, обзываем, мы «де...
Читать далее »

ЭГРЕГОР

Энергия эгрегора – квантовая структура, которая сформирована мыслями, знаниями и чувствами всего человечества – бывшего, настоящего и будущего. Эгрегор – это квантово лептонная скоррелированная структура, рожденная похожими мы...
Читать далее »

Как открыть свои чакры

Открытие чакр увеличивает поток энергии в теле и вокруг него и, следовательно, улучшает наше физическое, ментальное и эмоциональное здоровье. Представьте себе каждую чакру по очереди. Они вращаются и становятся больше в размере. Начинайте с 1 – й чакры (пусть они вращаются в любую сторону, обычно они вращаются в разные). В то же ...
Читать далее »

Смерть или новая жизнь

Из разговора двух зародышей в утробе матери: – Как ты думаешь, есть ли жизнь после родов? – Не знаю, оттуда еще никто не возвращался… Сравнительно недавно появились сенсационные сообщения доктора Раймонда А. Моуди о том, что ученые зарегистрировали фа...
Читать далее »

Чакры

Чакры являются основными энергетическими органами биополя. Они контролируют нашу деятельность во внешнем мире, а каждая из чакр несет ответственность за определенную сферу деятельности. Основное предназначение их заключается в том, что они несут ответственность за поддержание энергообмена живого организма с окружающей средой через специальные каналы связи. Таким образом, при нарушении процесса энергообмена у нас возникают болезни и проблемы...
Читать далее »

Три колонны космоса

Показания: нарушение обменных процессов, снижение иммунитета, обновление сил. Методика исполнения. Средний и сердечный пальцы правой руки кладут на аналогичные пальцы левой руки. Мизинец левой руки кладут возле основания тыльной поверхности среднего и безымянного пальцев правой руки, затем все фиксируется мизинцем правой руки. Кон...
Читать далее »

Заключение

Лучше зажечь свечу, чем проклинать сгущающуюся тьму. Дзенское изречение Вот и написана книга. Мне хочется верить, что вам она обязательно поможет в познании себя, утверждении своего «Я», определении своего места во Вселенной. На ум приходит китайская пословица: «Если не менять направление, мы наверняка достигнем того, к чему идем». А мы идем к Свету, Добру и Счастью. Мы ...
Читать далее »