Read-only transactions: What’s their purpose short of preventing unintentional writes? I’ve done a bunch of digging and the only thing I can come up with is that it doesn’t require the client to track conflict ranges. Otherwise the read part of a read-write transaction seems to do the same amount of work as a read-only transaction: GRV, and then read from the storage servers.
At the API layer it is also useful to explicitly document in the signature that a method may write and cause conflicts, or is read only and should probably not create conflicts (if nobody else writes)
Attempting to call a method that wants a writable transaction from code that is accepting a readonly transaction is a sign that something got mixed up somewhere.