These two threads have been...interesting. I'll chime in on both threads here. (Warning: written in haste.)
I understand why async session waits until save changes. I also see why being symmetric behavior wise to sync session might be a good thing. I also see why "send a pull request, this is low priority" is a valid response.
How's that for ambivalence? :-)
Assume you just make Store set the id in a sync manner. What we're really talking about is, every N store requests, the session will reach out to the db for a new hi/lo range. Considering you can also tweak the size of that range, this seems like a micro optimization.
That said, fine, we will await the 5 ms to get the hi/lo. But why StoreAsync?
Store on the async session can just await getting the new hi/lo range itself.
IMO, all of the XyzAsync methods feel like api clutter. If I'm using the async session, I would expect that the relevant methods (ToList/Count/Store/SaveChanges) return Tasks that I can choose to await rather than having to call the XyzAsync equivalent method.
Not having looked at the Async Session code, it may be impossible to redefine the return signatures of the various methods on the interface without a lot of work throughout the code base. If so, then XyzAsync is a livable compromise. Still, async session Store can just handle do its own "awaiting". Await would only be necessary assuming hi/lo is in play for the Store. StoreAsync on a doc with an id set to "config/staticname" is strange. Having to remember to use the right one is annoying.
@James - I'm not convinced you are as belligerent as you appear in your thread posts. However, from the perspective of people sitting in their own homes or offices that have their own problems to contend with, your tone doesn't help solicit thoughtful responses. Most folks won't have an accounting background, so simply saying that the domain is _easy_ isn't enough.
As to stale indexes not being "safe by design", this is standard eventual consistency. To Chris' point, Raven gives you choices and levers. In a standard rdbms setup, you have no choice but to be immediately consistent. So you or the dba spends time trying to compromise the design for reads _and_ writes.
In Raven, you can explicitly choose that causal observers of an account can see stale data. This is perfectly fine when people are trying to "get an idea about the state of the account". Oh I've got ~$20k in that account. It doesn't matter that there a $7 check was clearing at around the time I queried.
For users/processes that are making _decisions_ based on the current state of the account, you can explicitly choose that _they_ see the latest up to date information through Load or making them wait on the indexes to complete. This is always imperfect because a human could be in the process of making a decision that will affect the state in the near future (seconds) but the system has been made aware of this fact. Your software simply records actions AsOf time and can remain logically consistent even if one could surmise that the user _might have_ acted differently with newer information.
In the end, you could make Raven behave exactly like an RDBMS and make every user wait for everything to be consistent. This is a choice, and the fact that it is a choice is important, and powerful.
In terms of modeling, there are dozens of ways to model any domain. Anyone commenting here is surmising based on limited knowledge. Likely their entire understanding comes from the paragraphs you have written. Often this will not connect with your mental model because you have so much more information baked in.
I actually do consult/contract for a living. It sounds like you have an interesting problem space regardless of the persistence technology you choose. My rate is considerably cheaper than Chris' proposal. I have availability May 1.