[
https://issues.apache.org/jira/browse/IGNITE-15086?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Alexey Scherbakov updated IGNITE-15086:
---------------------------------------
Epic Link: IGNITE-15081
> Design a public tx API
> ----------------------
>
> Key: IGNITE-15086
> URL: https://issues.apache.org/jira/browse/IGNITE-15086
> Project: Ignite
> Issue Type: Task
> Reporter: Alexey Scherbakov
> Assignee: Alexey Scherbakov
> Priority: Major
> Labels: iep-61, ignite-3
> Fix For: 3.0.0-alpha3
>
> Time Spent: 1.5h
> Remaining Estimate: 0h
>
> Design a public tx API.
> The proposed design includes async and sync APIs to execute a transaction.
> The transaction facade looks like this:
> {code:java}
> /**
> * Ignite Transactions facade.
> */
> public interface IgniteTransactions {
> /**
> * Begins the transaction.
> *
> * @return The future.
> */
> CompletableFuture<Transaction> beginAsync();
> /**
> * Synchronously executes a closure within a transaction.
> * <p>
> * If the closure is executed normally (no exceptions), the transaction
> is automatically committed.
> *
> * @param clo The closure.
> */
> void runInTransaction(Consumer<Transaction> clo);
> }
> {code}
> Transacton interface:
> {code:java}
> /**
> * The transaction.
> */
> public interface Transaction {
> /**
> * Synchronously commits a transaction.
> * Does nothing if it's already finished by committing or rolling back.
> */
> void commit();
> /**
> * Asynchronously commits a transaction.
> * Does nothing if it's already finished by committing or rolling back.
> *
> * @return The future.
> */
> CompletableFuture<Void> commitAsync();
> /**
> * Synchronously rolls back a transaction.
> * Does nothing if it's already finished by committing or rolling back.
> */
> void rollback();
> /**
> * Asynchronously rolls back a transaction.
> * Does nothing if it's already finished by committing or rolling back.
> *
> * @return The future.
> */
> CompletableFuture<Void> rollbackAsync();
> }
> {code}
> Example of synchronous transaction:
> {code:java}
> igniteTransactions.runInTransaction(tx -> {
> Table txTable = table.withTransaction(tx); // table view enlisted
> in the transaction.
> txTable.upsertAsync(...);
> tx.commit();
> });
> {code}
> Example of asynchronous transaction:
> {code:java}
> igniteTransactions.beginAsync()
> .thenApply(tx -> accounts.withTransaction(tx))
> .thenCompose(txTbl -> txTbl.upsertAsync(...).thenApply(i ->
> txTbl.transaction()))
> .thenCompose(Transaction::commitAsync);
> {code}
--
This message was sent by Atlassian Jira
(v8.20.1#820001)