1. yes, it is. If you only read just run the read out of the scope of a transaction. Even if you run in the scope of a transaction, the prepare call is very cheap.
2. that's correct as well
3. a prepare is sent once per cache/transaction. In your example there should be 2 prepare calls: one for c1 and one for c2.