Andrus Adamchik created CAY-1778:
------------------------------------

             Summary: TransactionManager to simplify user-managed transactions
                 Key: CAY-1778
                 URL: https://issues.apache.org/jira/browse/CAY-1778
             Project: Cayenne
          Issue Type: Bug
            Reporter: Andrus Adamchik
            Assignee: Andrus Adamchik
             Fix For: 3.2M1


Getting the semantics of manual transactions right is really hard: 
http://cayenne.apache.org/docs/3.0/understanding-transactions.html We need 
something more straightforward and DI based. Proposing the following:

public interface TransactionManager {

    /**
     * Starts a new transaction (or joins an existing one) calling
     * {@link TransactionalOperation#perform(CayenneRuntime)}, and then
     * committing or rolling back the transaction. Frees the user
     */
    <T> T performInTransaction(TransactionalOperation<T> op);
}

public interface TransactionalOperation<T> {

    /**
     * A callback method that {@link TransactionManager} invokes,
     * {@link TransactionManager} will wrap this method call in a single
     * thread-bound transaction.
     */
    T perform(CayenneRuntime runtime);
}

So a custom block of code to run in TX may look like this:

runtime.getTransactionManager().performInTransaction(new 
TransactionalOperation<SomeType>() {
    SomeType perform(CayenneRuntime runtime) {
      // do something
    }
});

or maybe even:

runtime.performInTransaction(new TransactionalOperation<SomeType>() {
    SomeType perform(CayenneRuntime runtime) {
      // do something
    }
});

Later we may even use TransactionManager API for internal tx's to achieve 
uniformity.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to