The attached file is a reproducer. Drop it into the STM tests directory and run to see the failure.
It creates two transactional objects A and B. B is further annotated with @NestedTopLevel. The test:
- starts a transaction A;
- calls a write method on A;
- then calls a write method on B which throws an exception;
- aborts or commits A (either outcome produces the error)
Since the container starts a top-level transaction for the call to the method on B I would expect it to abort it if the B method throws an exception. What I find is that it will always call commit.
This behaviour limits the usefulness of @NestedTopLevel when such methods are called inside an existing transaction since there is no mechanism for rolling back changes.