I am using ignite 1.6.I am trying to execute two transactions in parallel and
expecting one of them to fail since the same cache keys are updated. I found
that the second transaction doesn't fail and the commit succeeds. Below is
the code I am trying out let me know what is missing.
After starting a server node, below is the code executed on the client node
public void testMultiThreadTransactionsOnSimpleCache() {
CacheConfiguration<Integer, Integer> cfg = new
CacheConfiguration<>();
cfg.setName("IntCache");
cfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
try (Ignite ignite = initializeIgniteInClientMode()) {
IgniteCache<Integer, Integer> cache =
ignite.getOrCreateCache(cfg);
ExecutorService executorService =
Executors.newFixedThreadPool(2);
final CountDownLatch latch = new CountDownLatch(2);
executorService.submit(() -> {
logger.info("Starting a thread");
try (Transaction tx =
ignite.transactions().txStart(TransactionConcurrency.OPTIMISTIC,
TransactionIsolation.READ_COMMITTED)) {
for (int i = 0; i < 20; i++) {
cache.put(i, 500 + i);
}
tx.commit();
}
logger.info("Commit done");
latch.countDown();
});
executorService.submit(() -> {
logger.info("Starting a thread");
try (Transaction tx =
ignite.transactions().txStart(TransactionConcurrency.OPTIMISTIC,
TransactionIsolation.READ_COMMITTED)) {
for (int i = 0; i < 20; i++) {
cache.put(i, 600 + i);
}
latch.countDown();
try {
latch.await(); //making sure that the first thread
is done with the commit
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
try {
TimeUnit.SECONDS.sleep(2); //making sure that the
first thread is done with the commit
} catch (InterruptedException e) {
e.printStackTrace();
}
logger.info("Trying a commit");
try {
tx.commit();
} catch (TransactionOptimisticException e) {
logger.error("Transaction Failed", e);
}
}
});
executorService.shutdown();
try {
executorService.awaitTermination(Long.MAX_VALUE,
TimeUnit.NANOSECONDS);
logger.info("All threads complete");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
logger.info("Cache size : {}", cache.size());
for (Cache.Entry<Integer, Integer> aCache : cache) {
logger.info("Key : {}, Value : {}", aCache.getKey(),
aCache.getValue());
}
}
}
Below are the logs
19:12:55.958 INFO [pool-2-thread-2][c.o.s.i.test.TransactionTest] Starting
a thread
19:12:55.969 INFO [pool-2-thread-1][c.o.s.i.test.TransactionTest] Starting
a thread
19:12:56.194 INFO [pool-2-thread-1][c.o.s.i.test.TransactionTest] Commit
done
19:12:58.194 INFO [pool-2-thread-2][c.o.s.i.test.TransactionTest] Trying a
commit
19:12:58.212 INFO [main][c.o.s.i.test.TransactionTest] All threads complete
19:12:58.290 INFO [main][c.o.s.i.test.TransactionTest] Cache size : 20
19:12:58.319 INFO [main][c.o.s.i.test.TransactionTest] Key : 6, Value : 606
19:12:58.319 INFO [main][c.o.s.i.test.TransactionTest] Key : 12, Value :
612
19:12:58.319 INFO [main][c.o.s.i.test.TransactionTest] Key : 19, Value :
619
19:12:58.319 INFO [main][c.o.s.i.test.TransactionTest] Key : 5, Value : 605
19:12:58.319 INFO [main][c.o.s.i.test.TransactionTest] Key : 13, Value :
613
19:12:58.320 INFO [main][c.o.s.i.test.TransactionTest] Key : 0, Value : 600
19:12:58.320 INFO [main][c.o.s.i.test.TransactionTest] Key : 18, Value :
618
19:12:58.320 INFO [main][c.o.s.i.test.TransactionTest] Key : 7, Value : 607
19:12:58.320 INFO [main][c.o.s.i.test.TransactionTest] Key : 8, Value : 608
19:12:58.320 INFO [main][c.o.s.i.test.TransactionTest] Key : 9, Value : 609
19:12:58.320 INFO [main][c.o.s.i.test.TransactionTest] Key : 2, Value : 602
19:12:58.320 INFO [main][c.o.s.i.test.TransactionTest] Key : 17, Value :
617
19:12:58.321 INFO [main][c.o.s.i.test.TransactionTest] Key : 15, Value :
615
19:12:58.321 INFO [main][c.o.s.i.test.TransactionTest] Key : 16, Value :
616
19:12:58.322 INFO [main][c.o.s.i.test.TransactionTest] Key : 1, Value : 601
19:12:58.322 INFO [main][c.o.s.i.test.TransactionTest] Key : 10, Value :
610
19:12:58.322 INFO [main][c.o.s.i.test.TransactionTest] Key : 14, Value :
614
19:12:58.322 INFO [main][c.o.s.i.test.TransactionTest] Key : 3, Value : 603
19:12:58.322 INFO [main][c.o.s.i.test.TransactionTest] Key : 11, Value :
611
19:12:58.322 INFO [main][c.o.s.i.test.TransactionTest] Key : 4, Value : 604
I am expecting the second transaction to fail and the cache to have 20
entries with values between 500 and 520.
I tried out changing the concurrent mode and the isolation levels too but
that didn't make a difference.
To verify that the transactions are working correctly I tried to
sequentially execute two transactions with one executing commit and another
rollback. That works as expected.
Thanks.
--
View this message in context:
http://apache-ignite-users.70518.x6.nabble.com/Multi-threaded-transactions-tp6563.html
Sent from the Apache Ignite Users mailing list archive at Nabble.com.