Alexey, and is there any analogue to close() of transaction? When you start
transaction, you should somehow to close it, if you don't catch exception
or forget to commit.

I suggest to add method closeAsync() to Transaction, so user can call it in
handle or whenComplete, i.e.

So code will looks like

CacheApi cache = CacheApi.getCache("testCache");

Transactions
    .beginTransaction()
    .thenCompose(tx -> {
        CacheApi txCache = cache.withTx(tx);
        CompletableFuture<Void> result = txCache.getAsync("key")
            .thenCompose(val -> {
                if (val == "test") {
                    return txCache.putAsync("key", "test1");
                }
                else
                    return CompletableFuture.completedFuture(null);
            })
            .thenCompose(v -> tx.commitAsync())
            .handle((v, ex) -> null);
        return result.thenCompose(v -> tx.closeAsync());
    });

I also suggests to add method something like this

static CompletableFuture<Void> inTxAsync(Function<Transaction,
CompletableFuture<Void>> action) {
    return Transactions
        .beginTransaction()
        .thenCompose(tx -> {
            CompletableFuture<Object> result = action.apply(tx)
                .handle((v, ex) -> null);
            return result.thenCompose(v -> tx.closeAsync());
        });
}

Async api is not very readable, but this method can help user write code,
this is rewritten first example:

Transactions.inTxAsync(tx -> {
    CacheApi txCache = cache.withTx(tx);
    return txCache.getAsync("key")
        .thenCompose(val -> {
            if (val == "test") {
                return txCache.putAsync("key", "test1");
            }
            else
                return CompletableFuture.completedFuture(null);
        })
        .thenCompose(v -> tx.commitAsync());
});

ср, 14 июл. 2021 г. в 10:03, Alexei Scherbakov <alexey.scherbak...@gmail.com
>:

> Andrey,
>
> I suggest you look at the PR [1], if you haven't.
>
> A transaction [2]
> Transactions facade [3]
> Examples [4]
>
> [1] https://github.com/apache/ignite-3/pull/214/files
> [2]
>
> https://github.com/apache/ignite-3/blob/d2122ce8c15de020e121f53509bd5a097aac9cf2/modules/api/src/main/java/org/apache/ignite/tx/Transaction.java
> [3]
>
> https://github.com/apache/ignite-3/blob/d2122ce8c15de020e121f53509bd5a097aac9cf2/modules/api/src/main/java/org/apache/ignite/tx/IgniteTransactions.java
> [4]
>
> https://github.com/apache/ignite-3/blob/d2122ce8c15de020e121f53509bd5a097aac9cf2/modules/table/src/test/java/org/apache/ignite/internal/table/TxTest.java
>
>
> вт, 13 июл. 2021 г. в 19:41, Andrey Gura <ag...@apache.org>:
>
> > Alexey,
> >
> > could you please describe Transaction interface?
> >
> > Also it would be great to have a couple examples of using the proposed
> API.
> >
> > On Tue, Jul 13, 2021 at 4:43 PM Alexei Scherbakov
> > <alexey.scherbak...@gmail.com> wrote:
> > >
> > > Folks,
> > >
> > > I've prepared a PR implementing my vision of public transactions API.
> > >
> > > API is very simple and similar to Ignite 2, but has some differences.
> > >
> > > More details can be found here [1]
> > >
> > > Share your thoughts.
> > >
> > > [1] https://issues.apache.org/jira/browse/IGNITE-15086
> > >
> > > --
> > >
> > > Best regards,
> > > Alexei Scherbakov
> >
>
>
> --
>
> Best regards,
> Alexei Scherbakov
>


-- 
Sincerely yours, Ivan Daschinskiy

Reply via email to