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