cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrus Adamchik <and...@objectstyle.org>
Subject Re: Transaction Management Question
Date Mon, 19 Mar 2012 14:30:28 GMT
Hi there,

This seems to be a duplicate of the earlier message. John gave a completely correct answer
about ServerRuntime and ObjectContext scoping. 

> Maybe I'm not correctly using Cayenne to manage transaction when we have
> more than one server runtime. If so, what's the best way to achieve that
> please?

If you have 2 runtimes accessing 2 independent databases, and want to commit 2 contexts to
those together, you can either commit them independently (c1.commitChanges(); c2.commitChanges();
- they won't be a part of the same transaction with all the consequences), or find a solution
for distributed transaction management (so called XA transactions). In the later case you
can check "External Transactions" in Cayenne, and let the JEE container handle those.

I'd much prefer the former solution and the app dealing with consequences, to much heavier
XA transactions. But Cayenne would allow you to use the later by absolving itself of TX handling
responsibility and letting you or your appserver to handle all that two-phase commit fun stuff.

Andrus


On Mar 19, 2012, at 5:10 PM, YK 7 wrote:
> Andrus,
> 
> I'm new to Cayenne and I'm testing the Cayenne's transaction management
> using the following scenario:
> 
> I have a simple web application that uses Spring to create
> singletons(Services, DAOs...) and make the dependencies injection.
> My example is using two different Databases (MySQL and Oracle) and thus, I
> have defined two Cayenne Server Runtimes:
> One for Oracle and one for MySQL. Those two ServerRuntimes are instantiated
> once in a singleton.
> 
> I'm trying to use Cayenne Transactions using :
> Transaction tx = serverRuntime.getDataDomain().createTransaction().
> ....
> tx.commit(); //or tx.rollback() depending on the situation
> 
> The problem here is that if I do so, it means that if a user(or HTTP
> session) changes are committed, all other users(or HTTP sessions) changes
> will also be committed.
> This is because serverRuntime is a singleton and the transaction is created
> against it (and not against the objectContext which is bound to the HTTP
> session).
> 
> I also took a look at the ServerRuntime source code and noticed that it
> defines two instance properties (injector and modules which are in the
> parent class: CayenneRuntime).
> 
> If I'm not mistaken, this means that ServerRuntime is not a good candidate
> to be defined as a singleton (one instance per application).
> 
> Maybe I'm not correctly using Cayenne to manage transaction when we have
> more than one server runtime. If so, what's the best way to achieve that
> please?
> 
> 
> Thanks


Mime
View raw message