/** * Check transaction state. */ private static void assertTxState(Transaction tx, TransactionState state) { assertEquals(state, tx.state()); } }
/** * Check transaction state. */ private static void assertTxState(Transaction tx, TransactionState state) { assertEquals(state, tx.state()); } }
/** * @param id Transaction ID. * @return Transaction state. */ private int txClose(long id) { Transaction tx = tx(id); try { tx.close(); return tx.state().ordinal(); } finally { unregisterTx(id); } }
@Override public Void call() throws Exception { Transaction tx; try (Transaction tx0 = tx = txs.txStart(concurrency, isolation)) { cache.put(key, key); tx0.commit(); } assertEquals(TransactionState.ROLLED_BACK, tx.state()); return null; } }, IgniteTxHeuristicCheckedException.class);
@Override public Void call() throws Exception { Transaction tx; try (Transaction tx0 = tx = txs.txStart(concurrency, isolation)) { cache.put(1, 1); tx0.commit(); } assertEquals(TransactionState.ROLLED_BACK, tx.state()); return null; } }, IgniteTxHeuristicCheckedException.class);
@Override public void applyx(Ignite ignite, final IgniteCache<Integer, Integer> cache) throws Exception { for (TransactionIsolation isolation : TransactionIsolation.values()) { final Transaction tx = ignite.transactions().txStart(OPTIMISTIC, isolation); cache.put(1, 1); cache.put(2, 2); tx.suspend(); assertNull("There is no transaction for current thread", ignite.transactions().tx()); assertEquals(SUSPENDED, tx.state()); GridTestUtils.runAsync(new Runnable() { @Override public void run() { tx.resume(); assertEquals(ACTIVE, tx.state()); cache.put(3, 3); tx.rollback(); } }).get(FUT_TIMEOUT); assertTrue(GridTestUtils.waitForCondition(new PA() { @Override public boolean apply() { return tx.state() == ROLLED_BACK; } }, getTestTimeout())); assertEquals(ROLLED_BACK, tx.state()); assertFalse(cache.containsKey(1)); assertFalse(cache.containsKey(2)); assertFalse(cache.containsKey(3)); cache.removeAll(); } } });
@Override public void applyx(Ignite ignite, final IgniteCache<Integer, Integer> cache) throws Exception { for (TransactionIsolation isolation : TransactionIsolation.values()) { final Transaction tx = ignite.transactions().txStart(OPTIMISTIC, isolation, TX_TIMEOUT, 0); cache.put(1, 1); U.sleep(TX_TIMEOUT * 2); GridTestUtils.assertThrowsWithCause(new Callable<Object>() { @Override public Object call() throws Exception { tx.suspend(); return null; } }, TransactionTimeoutException.class); assertTrue(GridTestUtils.waitForCondition(new PA() { @Override public boolean apply() { return tx.state() == ROLLED_BACK; } }, getTestTimeout())); assertEquals(ROLLED_BACK, tx.state()); tx.close(); assertNull(cache.get(1)); } } });
@Override public void applyx(Ignite ignite, final IgniteCache<Integer, Integer> cache) throws Exception { for (TransactionIsolation isolation : TransactionIsolation.values()) { final Transaction tx = ignite.transactions().txStart(OPTIMISTIC, isolation, TX_TIMEOUT, 0); cache.put(1, 1); tx.suspend(); U.sleep(TX_TIMEOUT * 2); GridTestUtils.assertThrowsWithCause(new Callable<Object>() { @Override public Object call() throws Exception { tx.resume(); return null; } }, TransactionTimeoutException.class); assertTrue(GridTestUtils.waitForCondition(new PA() { @Override public boolean apply() { return tx.state() == ROLLED_BACK; } }, getTestTimeout())); assertEquals(ROLLED_BACK, tx.state()); tx.close(); } } });
assertEquals(COMMITTED, tx.state());
/** {@inheritDoc} */ @Override public long processInLongOutLong(int type, long val) throws IgniteCheckedException { switch (type) { case OP_PREPARE: ((TransactionProxyImpl)tx(val)).tx().prepare(true); return TRUE; case OP_COMMIT: tx(val).commit(); return txClose(val); case OP_ROLLBACK: tx(val).rollback(); return txClose(val); case OP_CLOSE: return txClose(val); case OP_SET_ROLLBACK_ONLY: return tx(val).setRollbackOnly() ? TRUE : FALSE; case OP_STATE: return tx(val).state().ordinal(); case OP_RESET_METRICS: txs.resetMetrics(); return TRUE; } return super.processInLongOutLong(type, val); }
/** * @throws Exception If failed. */ @Test public void testTxIsCommittedOnDdlRequestMultinode() throws Exception { Ignite node = startGridsMultiThreaded(4); IgniteCache<Object, Object> cache = node.cache(DEFAULT_CACHE_NAME); try (Transaction tx = node.transactions().txStart()) { cache.putAll(F.asMap(1, 1, 2, 2, 3, 3)); try (FieldsQueryCursor<List<?>> cur = cache.query(new SqlFieldsQuery( "CREATE TABLE " + " person (id int, name varchar, age int, company varchar, city varchar, primary key (id, name, city))" + "WITH " + " \"template=PARTITIONED,atomicity=TRANSACTIONAL,affinity_key=city\"").setSchema("PUBLIC"))) { assertNotNull(cur); List<List<?>> rows = cur.getAll(); assertEquals(1, rows.size()); assertEquals(0L, rows.get(0).get(0)); } assertTrue(tx.state() == TransactionState.COMMITTED); } try (FieldsQueryCursor<List<?>> cur = cache.query(new SqlFieldsQuery("SELECT * FROM person").setSchema("PUBLIC"))) { assertNotNull(cur); List<List<?>> rows = cur.getAll(); assertEquals(0, rows.size()); } assertEquals(1, cache.get(1)); assertEquals(2, cache.get(2)); assertEquals(3, cache.get(3)); }
/** * @throws Exception If failed. */ @Test public void testTxIsCommittedOnDdlRequest() throws Exception { Ignite node = startGrid(); IgniteCache<Object, Object> cache = node.cache(DEFAULT_CACHE_NAME); try (Transaction tx = node.transactions().txStart()) { cache.putAll(F.asMap(1, 1, 2, 2, 3, 3)); try (FieldsQueryCursor<List<?>> cur = cache.query(new SqlFieldsQuery( "CREATE TABLE " + " person (id int, name varchar, age int, company varchar, city varchar, primary key (id, name, city))" + "WITH " + " \"template=PARTITIONED,atomicity=TRANSACTIONAL,affinity_key=city\"").setSchema("PUBLIC"))) { assertNotNull(cur); List<List<?>> rows = cur.getAll(); assertEquals(1, rows.size()); assertEquals(0L, rows.get(0).get(0)); } assertTrue(tx.state() == TransactionState.COMMITTED); } try (FieldsQueryCursor<List<?>> cur = cache.query(new SqlFieldsQuery("SELECT * FROM person").setSchema("PUBLIC"))) { assertNotNull(cur); List<List<?>> rows = cur.getAll(); assertEquals(0, rows.size()); } assertEquals(1, cache.get(1)); assertEquals(2, cache.get(2)); assertEquals(3, cache.get(3)); }
assertTrue(tx.state() == TransactionState.COMMITTED);
assertNull(fut2.get()); assert f == null || f.get().state() == COMMITTED;
assertNull(fut2.get()); assert f == null || f.get().state() == COMMITTED;
boolean res = GridTestUtils.waitForCondition(() -> tx.state() == ROLLED_BACK, TX_TIMEOUT * 10);
/** * @param id Transaction ID. * @return Transaction state. */ private int txClose(long id) { Transaction tx = tx(id); try { tx.close(); return tx.state().ordinal(); } finally { unregisterTx(id); } }