I am curious about the fears of letting the table auto increment itself. I would see that being the most fail-safe option to certify a new invoice number. You had mentioned it needs to be pre-generated, but it looks as if you are generating the number on the fly still. Can you share what you feel might be some of the drawbacks you see in this scenario with the built-in auto increment?
Now to answer your question more directly, I agree with you that it sounds like you may have contention on the table with double inserting. Unfortunately, the only way to solve that would have a single queue thread/process lock that can force actions to process in a FIFO (First In, First Out) format.