Either business data and job are committed or none of them. Then as you write, either polling or listening to an even worker, can pick it up.
Bonus stuff, from implementation perspective, is that if worker selects row FOR UPDATE (locking the job from others to pick up) and dies, Postgres will release the lock after some time, making the job available for other workers.