Assuming you are using "BEFORE_COMMIT" transaction phase since you want them to run all in one transaction. When you have a @TransactionalEventListener with phase "BEFORE_COMMIT" implies that there is already an active transaction. You don't need to put another @Transactional annotation. It causes some problems when used with default "AFTER_COMMIT" which is described in detail here, like you mentioned.
Now I have to create a new transaction (REQUIRES_NEW), and if something goes wrong, I can't roll back A entity. Why is this?
No, you don't have to set propagation to "REQUIRES_NEW". You can remove unnecessary @Transactional annotation.
You can also validate if the code is being executed in transaction with the help from:
TransactionSynchronizationManager.isActualTransactionActive()