In the general case, most reaction and projection handling can/should actually be considered at the stream level. Why?
Flattening everything down into a denormalized SQL relational model complete with hierarchical foreign key constraints is the poster child case where you would benefit from a global order - if you traverse from start to finish in large batches and presume you're starting from a blank read model, you can map everything to large transactional batches of inserts and updates, and you save a checkpoint position as part of the same batch. If you want to pause the processing, you can simply resume from the checkpoint in your read model
In reality, life is not that simple/complicated:
- you may not be writing to a general database that you own, so you may not be able to have a transaction across your checkpoint and your model writes
- if you're feeding to a partner