Before this commit, a room update and a soft deletion racing each other could leave the room active. Both `perform_update`s now re-read the room with `SELECT ... FOR UPDATE` inside a transaction to avoid this race condition.