I would submit this via a web service, and return a confirmation to the form (probably just a 1 or 0 value) to determine if the record was inserted correctly.
You can use whatever auto-number functionality your DB has (if it's Oracle, the nextval functionality) to generate the unique ID. If you want, you could return the ID to the form as the confirmation.
You won't be able to completely eliminate the possibility of dual submissions, because you never know what users will end up trying, but you can diminish the chance. When a "success" confirmation is returned, hide the submit button. Depending on the user's and the form's cache settings, clicking back and forward to return to the form should maintain this state.
Make sure you Reader Extend this form or users won't be able to fill it out using Reader.
You may be able to do this without a LiveCycle workflow, but it may just be easier to do so.
If you have any questions, feel free to email me. I hope some of this feedback helped. Thanks!