Previously, when data was unloaded from a transaction hierarchy using UnloadService, each transaction was processed separately: for each transaction, Unloading events were raised, then data was unloaded, then Unloaded events were raised. Then, the next transaction was processed. During the events raised for non-leaf transactions, those transactions were temporarily made writeable.
This has changed: now, all Unloading events are raised before any data is unloaded, then, all data is unloaded, and lastly, all Unloaded events are raised. This means that if one transaction cancels or prevents unloading data, no data is unloaded at all. Events raised for non-leaf transactions are no longer executed while these transactions are writeable; the handlers cannot change data of those transactions.
These changes have been made for consistency and stability: it makes no sense to unload data from some transactions in a hierarchy only to have a later transaction cancel the operation. And allowing event handlers to modify read-only transactions could lead to ClientTransaction data becoming inconsistent.