I think the best place to check this is in the business layer. This is an operation to be executed in the business layer, not in the persistence layer. Everything must be handled correctly before it achieves the server. If you implement your business method correctly (locking a record, then checking if it is still available for booking), then there's no need to check it in the server side (which I think is wrong).
That's how I did, and I think I reached a very clean design, which junior developers won't have any big work to understand.
That's my opinion. I'm already done with the code, so now I have to work on the documentation. It's thursday 11:59PM here in Brazil now, so I hope you guys have a good night, and I'll stay here "having fun" with the documentation!

Cheers, Roberto Perillo
SCJP, SCWCD, SCJD, SCBCD