The common term for the problem you are facing is set validation.
The basic problem is this - if you have some property of the set that must "always" be true, then you must (logically) lock the entire set when making changes that impact that property.
There are a couple of "escape hatches".
By far the most common answer is to dig more deeply into the business requirements, and discover that the property doesn't actually need to be "always true".  Some properties are always, in the sense that if the data is ever out of policy then we have expensive problems; but other properties are eventually, in the sense that we need them to be re-established by the time the system reaches equilibrium, but it isn't too damaging to be off policy for some (short) period of time.
Sometimes, you can redesign your data model, separating the data that needs to be kept in compliance with the policy from that which doesn't.  For instance, it might be that a "site" is a hierarchy of page identifiers, which you can manipulate without loading the page contents.  When you can do that, then you can have separate locks, such that Alex can be moving a page around in the site while at the same time Charlie is modifying the content.
(To some extent, this is a shell game - we aren't necessarily making problems "go away" so much as exchanging one set of problems for a different set that may be easier to solve.)
In the really unfortunate cases... you have to buy/rent hardware capable of performing the workloads that you need done.
There is no magic.