Multi-document transactions are the right answer, and they are unremarkable on a replica set now:
withTransaction also retries on transient errors, which hand-rolled commit/abort blocks usually forget.
Two caveats: they require a replica set (Atlas gives you one; a bare local mongod does not), and they are more expensive than single-document writes — so use them where atomicity actually matters, not everywhere.