Hello! I think that cache.iterator() is basically a scan query, and queries (such as SqlFieldsQuery or ContinuousQuery) do not honor transaction guarantees.
Regards, -- Ilya Kasnacheev чт, 20 авг. 2020 г. в 04:28, 38797715 <[email protected]>: > Hi guys, > > If you execute the following code, you will find that cache.iterator() > does not return a result. If the transaction is not started, the > returned result is correct. > Is this a bug or a known technical limitation? > > server side just start ignite.sh > > public class CacheTransactionExample { > > public static void main(String[] args) throws IgniteException { > Ignition.setClientMode(true); > try (Ignite ignite = Ignition.start()) { > System.out.println(); > > CacheConfiguration<Integer, Account> cfg = new > CacheConfiguration<>("Account"); > > cfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL); > IgniteCache<Integer, Account> cache = > ignite.getOrCreateCache(cfg); > > try (Transaction tx = > ignite.transactions().txStart(OPTIMISTIC, READ_COMMITTED)) { > cache.put(1, new Account(1, 100)); > cache.put(2, new Account(1, 200)); > > System.out.println(); > System.out.println(">>> " + cache.get(1)); > System.out.println(">>> " + cache.get(2)); > > Iterator it = cache.iterator(); > while(it.hasNext()) { > Cache.Entry<Integer, Account> acc = > (Cache.Entry<Integer, Account>)it.next(); > System.out.println("<<<" + acc.getValue()); > } > tx.commit(); > } > finally { > ignite.destroyCache("Account"); > } > } > } > > private static class Account implements Serializable { > private int id; > > private double balance; > > Account(int id, double balance) { > this.id = id; > this.balance = balance; > } > > void update(double amount) { > balance += amount; > } > > @Override public String toString() { > return "Account [id=" + id + ", balance=$" + balance + ']'; > } > } > } > >
