[ 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)