There are several reliable approaches to solve this:
Database-Level unique constraint
Pessimistic locking
Optimistic locking with retry logic
Message queues