Well. Consider transaction started in one node, and continued in another
one.
The following test describes my idea:
Ignite ignite1 = ignite(0);
IgniteTransactions transactions = ignite1.transactions();
IgniteCache<String, Integer> cache = ignite1.getOrCreateCache("testCache");
Transaction tx = transactions.txStart(concurrency, isolation);
cache.put("key1", 1);
cache.put("key2", 2);
tx.stop();
IgniteInternalFuture<Boolean> fut = GridTestUtils.runAsync(() -> {
IgniteTransactions ts = ignite(1).transactions();
Assert.assertNull(ts.tx());
Assert.assertEquals(TransactionState.STOPPED, tx.state());
ts.txStart(tx);
Assert.assertEquals(TransactionState.ACTIVE, tx.state());
cache.put("key3", 3);
Assert.assertTrue(cache.remove("key2"));
tx.commit();
return true;
});
fut.get();
Assert.assertEquals(TransactionState.COMMITTED, tx.state());
Assert.assertEquals((long)1, (long)cache.get("key1"));
Assert.assertEquals((long)3, (long)cache.get("key3"));
Assert.assertFalse(cache.containsKey("key2"));
In method *ts.txStart(...)* we just rebind *tx* to current thread:
public void txStart(Transaction tx) {
TransactionProxyImpl transactionProxy = (TransactionProxyImpl)tx;
cctx.tm().reopenTx(transactionProxy.tx());
transactionProxy.bindToCurrentThread();
}
In method *reopenTx* we alter *threadMap* so that it binds transaction
to current thread.
How do u think about it ?
вт, 7 мар. 2017 г. в 22:38, Denis Magda <[email protected]>:
> Hi Alexey,
>
> Please share the rational behind this and the thoughts, design ideas you
> have in mind.
>
> —
> Denis
>
> > On Mar 7, 2017, at 3:19 AM, ALEKSEY KUZNETSOV <[email protected]>
> wrote:
> >
> > Hi all! Im designing distributed transaction which can be started at one
> > node, and continued at other one. Has anybody thoughts on it ?
> > --
> >
> > *Best Regards,*
> >
> > *Kuznetsov Aleksey*
>
> --
*Best Regards,*
*Kuznetsov Aleksey*