Queueing MySQL record inserts to avoid over-subscription of a related resource ... table locking?
SELECT FOR UPDATE can't lock rows that don't exist, therefore if it is used on table seats, it cannot prevent the insertion of new rows. So if you use that, it has to be done on table lifeboats.
Since customers will be in a hurry to find a lifeboat with available seats, it would be better to let go of the slow count() and add a column occupied_seats in table lifeboats.
This should be updated via a before insert or delete trigger on seats, that does an update on the corresponding row from lifeboat. This update will automatically lock the row, which handles your concurrency issues.
This trigger should raise an error (use SIGNAL sql keyword) if the insert would exceed available seats.
This can be done in a semi lock-free manner by doing
UPDATE lifeboats SET occupied_seats = occupied_seats+1 
WHERE id=... AND occupied_seats &lt; available_seats;

then testing if that did update one row. That will save one SELECT FOR UPDATE. If it did not update the row, the lifeboat is full, throw an error. If it did, this also locks the row, so COMMIT quickly.