Also you pass the data a job needs to run as part of the job payload. Then you don't have the "data doesn't exist" issue.
The example on the home page makes this clear where a user is created and a job is created at the same time. This ensures that the job is queued up with the user creation. If any parts of that initial transaction fails, then the job queuing doesn't actually happen.