In my project, i am finding the need to break my aggregate in a hierarchical fashion, with top root level aggregate, which ensures consistency of rules at root level, and then my objects under the root, can be sub grouped into various aggregates. When calculating the integrity of root level aggregate, the root validates it's own rules and then delegates to sub aggregate's roots to determine if sub aggregate is valid.
Also, to implement optimistic locking, i am finding that if i apply locks at various sub aggregate level, i can allow my system to be highly concurrent as opposed to putting a lock at aggregate root level.
Is this a valid ddd approach?