public void test1() throws IgniteCheckedException, BrokenBarrierException, InterruptedException { CyclicBarrier barrier = new CyclicBarrier(2); Object monitor = new Object(); Boolean sleepWell = true; final IgniteCache cache = jcache(1); final IgniteCache remoteCache = jcache(); String remotePrimaryKey = String.valueOf(primaryKey(remoteCache)); final Transaction tx = ignite(1).transactions().txStart(TransactionConcurrency.PESSIMISTIC, TransactionIsolation.REPEATABLE_READ); cache.put(remotePrimaryKey, 1); tx.suspend(); final IgniteInternalFuture fut = GridTestUtils.runAsync(new Callable() { @Override public Boolean call() throws Exception { Assert.assertNull(transactions().tx()); Assert.assertEquals(TransactionState.SUSPENDED, tx.state()); tx.resume(); cache.put(remotePrimaryKey, 2); barrier.await(); synchronized (monitor) { monitor.wait(); } tx.commit(); return true; } }); barrier.await(); final Transaction tx2 = ignite(1).transactions().txStart(TransactionConcurrency.OPTIMISTIC, TransactionIsolation.REPEATABLE_READ); cache.put(remotePrimaryKey, 3); tx2.commit();// Hangs here synchronized (monitor) { monitor.notify(); } Assert.assertEquals(2, (long)jcache().get(remotePrimaryKey)); }