У члена команды возникла проблема со старой внутренней системой, где пользователь, дважды щелкнув ссылку на веб-странице, может вызвать отправку двух запросов из браузера, в результате чего две вставки базы данных одной записи в состояние гонки; последний из которых запускается с ошибкой первичного ключа. Некоторые решения и взломы были предложены и обсуждены:Дважды щелкните разрешения двойной вставки?
Использование Javascript на веб-странице, чтобы смягчить второй щелчок, отключив ссылку на первого щелчка. Это быстрый и простой способ уменьшить возникновение проблемы, но не полностью устранить ее.
Оберните выполнение запроса на стороне филиала в транзакции. Это считается слишком дорогостоящим из-за нагрузки на сервер и уровня блокировки в рассматриваемой таблице.
Поймать исключительное исключение первичного ключа, сброшенное неудавшейся вставкой, определить его как таковое и съесть. Это имеет недостатки (а) блокировки поставщика, необходимость знать нюансы исключений, специфичных для базы данных, и (б) потенциально не регистрировать/обрабатывать законные сбои базы данных.
Расширение №3 путем попытки обновления записи, если вставка не удалась и проверка результата обновления, чтобы гарантировать, что она возвращает 1 запись.
Другие варианты, которые не учитывались? Есть ли плюсы и минусы представленных вариантов, которые были упущены? Что является меньшим из всех зол?
Это добавляет много накладных расходов на стороне сервера - в ферме серверов они бы все, чтобы быть в курсе этого идентификатора, и они все должны синхронизировать и заблокировать его, чтобы не было состояния гонки, если два запроса были сбалансированы на двух разных серверах. – 2008-10-05 16:58:44
Если уникальный идентификатор является основным ключом для вставки базы данных, то ваша целостность базы данных позаботится об этом. – 2008-10-06 01:05:33