Является ли основной проблемой одновременный доступ? Я имею в виду, будут ли множественные экземпляры вашего приложения (или, не дай Бог, другие приложения вне вашего контроля) одновременно выполнять вставки?
Если нет, вы, вероятно, можете управлять вставками через центральный синхронизированный модуль в своем приложении и полностью избегать условий гонки.
Если так, хорошо ... как сказал Джоэл, измени базу данных. Я знаю, что вы не можете, но проблема стара, как холмы, и она хорошо решена - на уровне базы данных. Если вы хотите исправить это самостоятельно, вам просто придется циклически повторять (вставлять, проверять наличие коллизий, удалять) снова и снова. Основная проблема заключается в том, что вы не можете выполнить транзакцию (я имею в виду не «транзакцию» в SQL, а в смысле теории данных), если у вас нет поддержки со стороны базы данных.
Единственная мысль, которая у меня возникла, заключается в том, что если вы хотя бы контролируете, кто имеет доступ к базе данных (например, только «авторизованные» приложения, написанные или одобренные вами), вы можете реализовать мьютекс боковой полосы: виды, где «говорящая палка» является общей для всех приложений, и для выполнения вставки требуется владение мьютексом. Это был бы его собственный волосатый шарик воска, так как вам нужно было бы определить политику для мертвых клиентов, где они находятся, проблемы с конфигурацией и т. Д. И, конечно же, «мошеннический» клиент мог бы выполнять вставки без говорящей палки и шланг всей установки.