Personally, I have two sequence numbers:
1. Stream Sequence
Because I'm using events to back aggregates, I use this sequentially monotonically increasing number.
Each event must be exactly one greater than the one before it in the stream. I enforce this at the DB level with a unique index, so this effectively serves as concurrency protection. If the same aggregate was modified in two concurrent transactions, one of them would fail to save because they both would be trying to save the same stream id + sequence.
2. Global Sequence
Publishers and denormalizers need to know where they are at, so I just use a db IDENTITY column to do a monotonically increasing number.