I've done some research and testing using the select for update on HyperSQL and Postgres.  The problem with the explicit locking via select for update is that it's slower, not consistent between the two databases, and a little more tricky to make sure the locking is right.  Instead I have switched to just a regular transaction with repeatable read transaction isolation.  First one in wins, second one will fail and retry, which I think fits our needs very well.  The only thing that is a little tough is making sure you declare the transaction isolation before starting the transaction and don't have any extra transactions in there committing when you don't want them to.  I have a few commits below that have this change and a test case that shows the concurrency in action.