So two things:

1.  SessionWithAsyncTransaction is never accessed concurrently, unless I've misunderstood how the Enumerators work
2.  `hasTransactionFailed` can be private

So I'll make that private, definitely