Alex,

I'm not sure CloseAsync() is useful.
As a user, I'd expect runInTransaction(closure) will create Tx for me,
commit Tx after a successful closure call, and rollback Tx in case of error.

However, I insist Transaction should extend AutoClosable, that may be
useful for synchronous case.
    try (Transaction tx = beginTx()) {
       ...
       tx.commit();
    }
Block code above has the same semantic and shorter, rather than
    Transaction tx = beginTx();
    try {
       ...
       tx.commit();
    }
    catch (Throwable th) {
        tx.rollback();

        throw tx;
    }




On Wed, Jul 14, 2021 at 12:16 PM Alexei Scherbakov <
alexey.scherbak...@gmail.com> wrote:

> Ivan,
>
> And what if I have already committed transaction? Is it safe rollback
> already committed transaction? Rollback will silently return and do
> nothing? - yes, it is stated in the javadoc in the PR.
>
> Andrey,
>
> Then using "runInTransaction", lack of commit will cause a transaction to
> rollback automatically.
>
> There is no need for a "close" method, it just adds confusion.
>
>
> ср, 14 июл. 2021 г. в 11:37, Andrey Mashenkov <andrey.mashen...@gmail.com
> >:
>
> > Agree with Ivan.
> >
> > Method runInTransaction() should try to finish the transaction if the
> user
> > forgot to commit one.
> > I guess it might be a common mistake among new users.
> >
> > Also, I suggest to extent all table projections for better UX.
> > Let's allow
> >     table.kvView().withTx(tx)
> > to user may cache kvVew instance and do
> >     kvView.withTx(tx)
> > rather than
> >     table.withTx(tx).kvVew()
> >
> >
> >
> > On Wed, Jul 14, 2021 at 10:13 AM Ivan Daschinsky <ivanda...@gmail.com>
> > wrote:
> >
> > > 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
> > >
> >
> >
> > --
> > Best regards,
> > Andrey V. Mashenkov
> >
>
>
> --
>
> Best regards,
> Alexei Scherbakov
>


-- 
Best regards,
Andrey V. Mashenkov

Reply via email to