Re: [DAS] Transaction support - a bigger picture question

2007-09-13 Thread Luciano Resende
Hey, very good, some comments inline

One question that I have is regarding the Transaction Manager, who is
responsible for creating the transaction manager ? The SCA runtime, or
implementations ? In the case of SCA runtime, we need to investigate
that part, but I guess we can start by having it under the
implementation as a proof of concept for now.

On 9/13/07, Amita Vadhavkar [EMAIL PROTECTED] wrote:
 Hi,
 I have given this a try based on what I tried in JIRA-1665 (Sample Using
 JOTM with DAS)
 Here also I am using JOTM with SCA+DAS. Currently played with 2 simple
 intents:

I think we are going to use geronimo transaction manager with SCA
integration, and there is a sample on implementation.bepel on how to
use it, it's very simple, could you try using that one ?

 a transaction (Tx management from External TM), b noTransaction (Tx
 management from DAS)

 The only changes needed are as below:-
 A tuscany-data-engine-helper:-
 1)DataAccessEngineManager
 new method getDAS(String config, ConnectionInfo connectionInfo, ListIntent
 intents, ListPolicySet policySets)
 Here if intent atransaction is detected, ConnectionInfo.setManagedTx(false)
 will be called.
 This modified connnectionInfo will be passed through configHelper to the new
 DAS instance.
 This way if external TM is going to manage Tx, DAS is signaled for it.


Great... I'll leave comments on the policy side to Venkat or Sebastien
or others that have been playing on this area...

 And logic to support this method

 2) ConnectionInfo
 new attribute managedtx with setter/getter


Ok

 B tuscany-implementation-das
 1) DASImplementation implements PolicyAttachPoint

 2) DASImplementationProcessor
 read(reader) - will read policies and intents on DASImplementation from
 .composite


Who should read here, implementation.das or we should delegate to the
policy artifact processors ?


 3) DASImplementationProvider
 createInvoker() will call getDAS(passing config, connectioninfo, intents,
 policies)
 same will be for createCallbackInvoker()


What other information you will need from intents and policies when
creating DAS ? you already passed the managed transaction flag inside
the connectionInfo, right ? Note that there is still support for a das
config file, how are you going to manage that ? We probably need to
throw an exception if DAS config file sets does NOT set the managed
transaction flag, but transaction policy is set.

 With these above changes and with setup similar to JIRA-1665 sample, I could
 see
 that the external connection is being used by DAS (naming service is
 resolving
 datasource properly).

 The point I am stuck at is, in RDB-DAS, when we use external DS, we do not
 pass
 userName, password. But MYSQL (which with InnoDB supports Txn and works well
 with JOTM) does need id, pwd in ds.getConnection(). This can be case with
 other DBs as well.

 So, it looks like DAS config.xsd needs to allow passing userName, password
 in ConnectionInfo too ( and not just for ConnectionProperties).

 Thus below will be the changed DAS config portion:-
xsd:complexType name=ConnectionInfo
   xsd:sequence
 xsd:element  maxOccurs=1 minOccurs=0
 name=ConnectionProperties type=config:ConnectionProperties/
   /xsd:sequence
   xsd:attribute name=dataSource type=xsd:string/
   xsd:attribute name=managedtx type=xsd:boolean default=true/
   xsd:attribute name=userName type=xsd:string default=/
   xsd:attribute name=password type=xsd:string default=/
/xsd:complexType

xsd:complexType name=ConnectionProperties
  xsd:attribute name=driverClass type=xsd:string/
  xsd:attribute name=databaseURL type=xsd:string/
  xsd:attribute name=loginTimeout type=xsd:int
 default=0/
/xsd:complexType


Create a DAS jira for this, and we can investigate further...

 Suggestion? If this looks OK, I would like to make the above changes and
 create a sample in tuscany-implementation-das demoing use of intent and ext
 TM.

I have a demo in progress, probably is good to have a test case for
now, and we could incorporate transaction support on the demo.

 Will give a try with geronimo as well.



 Regards,
 Amita

 On 9/2/07, Jean-Sebastien Delfino [EMAIL PROTECTED] wrote:
 
  [snip]
  Luciano Resende wrote:
   I guess your suggestion for starting simple is fine, and I guess
   implementation.das could get integrated with SCA Policy and DAS would
   have the necessary support, unless we find some bugs on the DAS side.
   I'll see if I can get to this in the coming weeks...
  
   BTW, what transaction manager are we going to use in Tuscany ?  Do we
   have any today ?
  
 
  Two suggestions:
  - in a standalone environment, use JOTM [1]
  - in Geronimo, get the TM from Geronimo, as done in the Tuscany/Geronimo
  plugin at [2]
 
  [1] http://jotm.objectweb.org/
  [2] http://svn.apache.org/repos/asf/geronimo/plugins/tuscany
 
  --
  Jean-Sebastien
 
 
  

Re: [DAS] Transaction support - a bigger picture question

2007-09-02 Thread Jean-Sebastien Delfino

[snip]
Luciano Resende wrote:

I guess your suggestion for starting simple is fine, and I guess
implementation.das could get integrated with SCA Policy and DAS would
have the necessary support, unless we find some bugs on the DAS side.
I'll see if I can get to this in the coming weeks...

BTW, what transaction manager are we going to use in Tuscany ?  Do we
have any today ?
  


Two suggestions:
- in a standalone environment, use JOTM [1]
- in Geronimo, get the TM from Geronimo, as done in the Tuscany/Geronimo 
plugin at [2]


[1] http://jotm.objectweb.org/
[2] http://svn.apache.org/repos/asf/geronimo/plugins/tuscany

--
Jean-Sebastien


-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: [DAS] Transaction support

2007-08-31 Thread Amita Vadhavkar
Hi,
I have tried to use JOTM and Tomcat and would like to create a sample web
app in
DAS showing how external transaction manager can control DAS transactions.
I am creating another mail thread for any discussion for this sample + JOTM
issues.

We can demonstrate through this and accompanying wiki - how Txn support in
DAS
for externally managed txns should do.
Regards,
Amita

On 8/17/07, Luciano Resende [EMAIL PROTECTED] wrote:

 By doing a quick debug on Amita's testcase from JIRA-1543, looks like
 we might have some bugs in our current code, that might be causing
 this whole confusion. Let me spend couple hours on this over the
 weekend, and send some feedback after that. I'll also write a wiki
 page with what I think the Transaction support should do/work.

 On 8/17/07, Amita Vadhavkar [EMAIL PROTECTED] wrote:
  Just trying to see what changes will be needed (marked with )
  1) when connection from user, and he wants to delegate transaction
 control
  to DAS,
  allow it only per/Command. This will save user from issuing one
  commit/rollback per command in the client code. (i.e. current way of
  managetx=true default, connection passed from user). So this is as of
 today,
  no changes needed.
 
  2) when connection from user and user wants to control single/group of
  commands, he should set managedtx=false.
  -As default managedtx=true, user in this case will need to put
  ConnectionInfo element in config just for the sake of passing
  managedtx=false
  Giving new test case showing this
 
  3)-- fix logic of DASImpl.managingConnections() - should just look
 at
  managedtx
 
  4) when connection from DAS and user wants to control single/group of
  commands, he should set  managedtx=false
 
  --- new test cases showing manage single/group of Commands
 
  5)DAS will expose getConnection() for all cases except when connection
 by
  DAS, tx management by DAS
  --public Connection DAS.getConnection();
  For exception case throw RuntimeException from DAS -
  DAS is controlling transaction, can not expose Connection!
 
  5)
  awhen user passes connection in DAS() and also sets ConnectionInfo
  -datasource/drivermanager - specify that passed connection will be used
 and
  config connection will be ignored.
 
  bDAS can manage connection only when it is created internally and
  only/Command. i.e. DAS does not support internally managing transactions
 for
  group of commands
 
  -- Document - FAQs?
 
  6) DAS throws RuntimeException with embedded SQLException - may it be
  connection closed, integrity violation etc.
  ---no changes needed
 
  I will submit patch for JIRA-1466 using above summary shortly.
  Regards,
  Amita
  On 8/17/07, Adriano Crestani [EMAIL PROTECTED] wrote:
  
   forwarding last message to dev list...
  
   On 8/17/07, Adriano Crestani [EMAIL PROTECTED] wrote:
   
Hi Amita, thanks for the examples, it always helps to clarify : ).
 My
comments:
   
Use Case 1:
I think if there is part of the code the user needs to control the
transaction directly, he would never set the managedtx=true, that's
 why
managedtx is an option, to give a chance to the user decide if he
 wants
   or
not to control anytime the transaction. So, on my opinion it's an
 user
   error
that set the managedtx as true when he wants to control the
 transaction,
   and
not a DAS error.
   
I understand that your point is try to avoid a user mistake like
 this,
although the user needs to know well what the DAS interface does or
 not,
   and
on this case the DAS interface says: DAS will control the
 transactions
   when
you set managedtx=true. This kind of user mistake could be easily
   resolved
if a Connection object could be easily copied, but as far as I know
 it
can't.
   
Use Case 2:
Here I agree that not to expose the Connection when its created by
 DAS
   and
managedtx is false is a DAS mistake. That's why I vote to expose
getConnection and I see no problem to throw some kind of exception
 when
   user
tries to invoke getConnection when managedtx=true.
   
Use Case 3:
a) About user invoking closeConnection, it's the same case I
 described
   on
Use Case 1's comments, the user needs to be aware that DAS is
   controlling
the transactions. However, DAS should throw some kind of exception
 when
   the
Connection is closed externally, I don't know if it's doing that.
   
b) If exposing the getConnection, I do not see anything new in using
   these
new methods, start/endTransactions, that user cannot perform only
 using
   a
Connection object.
   
c) About data integrity, I think it's also wrong decision if the
 user
   set
the managedtx=true if he may further want to perform a rollback on
 the
   db.
   
In conclusion:
   
+1 for exposing getConnection
   
- for adding methods startTransaction and endTranscation
   
Regards,
Adriano Crestani
   
   
On 8/16/07, 

Re: [DAS] Transaction support - a bigger picture question

2007-08-27 Thread Jean-Sebastien Delfino

Comments inline.

[snip]
Amita Vadhavkar wrote:

I have not worked on the latest DAS-SCA integration so far, and am quite
sure Lucinao
will have good pointers in this area. But looking at the current
tuscany-implementation-das, can see the following possible.


Yes, I guess the idea is to:

- access Data inside an SCA component declared with implementation-das

- let the application developer annotate the component implementation 
and services with transaction policy intents to indicate what he wants 
in terms of transaction




So take this as my attempt to understand
intents/policySets
and DAS-SCA integration :)

DASImplementation implements org.apache.tuscany.sca.assembly.Implementationand
 contains org.apache.tuscany.sca.assembly.Service dasService.
Using dasService, requiredIntents on the Service can be found.

  


There are two categories of policy intents in SCA:

- implementation policy intents - used to indicate requirements of the 
component implementation (authorization for example, i.e. you must be 
authorized to execute my implementation)


- interaction policy intents - used to configure how a component will 
interact with others (confidentiality for example, i.e. messages 
exchanged with my component must be encrypted)


I think that the same will have to apply to transactions as well, the 
DAS implementation will probably have to deal with intents specified on 
both services and the implementation itself.



org.apache.tuscany.das.rdb.DAS interface can be enhanced to accept these
intents.  DAS
internally can configure DASConfig reflecting the intents specified , so
that DAS instance
construction happens with correct attributes. Based on these attributes DAS
transaction control
will occur (if intent is TransactionControl).

Intent TransactionControl can be qualified as say, 1) Container Transaction
Control,
2) DAS Transaction Control.
  


Can you describe this a bit more to help me understand what you mean by 
Container transaction control vs DAS transaction control?



Advantage of having intent attached to a service will be, using different
intents for different services
of same component.
  


Yes, different services - different interaction policies


Questions:
 What will be the policySets here?
Say,  if policySet/intent Container Transaction Control mandates that the
implementation should expose
 getConnection() so that container Runtime can use it, how this mandate can
be achieved?
  


Not sure at all yet. A PolicySet translates an Intent to the 
corresponding configuration of the underlying runtime, so it really 
depends on what the DAS + SCA runtime will expect.


[snip]

On 8/20/07, Mike Edwards [EMAIL PROTECTED] wrote:


Folks,

Sorry to cut across the discussion about Transaction support in DAS, but
are folks aware of the proposal for Transaction support in SCA?

which leads to the entertaining question of how the DAS transaction
support relates to the SCA transaction support.

The problem at the moment is that the SCA spec group only has an
unpublished draft of the Transaction support spec.  The intention is to
publish an updated draft in the near future.

However, I can say that the SCA spec mechanism is based on the use of
Intents to apply transactional characteristics to SCA components.

  


I've seen several exchanges on the list already from people interested 
in some support for transactions... So since the spec is not ready yet, 
how about starting now with something really simple like an 
implementation policy intent that would just say:

- transaction - i.e. my implementation must run as part of a transaction
- noTransaction - i.e. I don't want to run as part of a transaction

It may look simplistic, but will help us understand the end to end 
story, work on the necessary plumbing and integration with a transaction 
manager etc. and we can always add more later and adjust the details of 
the intents and policySets when the spec is ready.


Thoughts?

--
Jean-Sebastien


-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: [DAS] Transaction support - a bigger picture question

2007-08-20 Thread Mike Edwards

Folks,

Sorry to cut across the discussion about Transaction support in DAS, but 
are folks aware of the proposal for Transaction support in SCA?


which leads to the entertaining question of how the DAS transaction 
support relates to the SCA transaction support.


The problem at the moment is that the SCA spec group only has an 
unpublished draft of the Transaction support spec.  The intention is to 
publish an updated draft in the near future.


However, I can say that the SCA spec mechanism is based on the use of 
Intents to apply transactional characteristics to SCA components.



Yours,  Mike.

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: [DAS] Transaction support

2007-08-17 Thread Amita Vadhavkar
Just trying to see what changes will be needed (marked with )
1) when connection from user, and he wants to delegate transaction control
to DAS,
allow it only per/Command. This will save user from issuing one
commit/rollback per command in the client code. (i.e. current way of
managetx=true default, connection passed from user). So this is as of today,
no changes needed.

2) when connection from user and user wants to control single/group of
commands, he should set managedtx=false.
-As default managedtx=true, user in this case will need to put
ConnectionInfo element in config just for the sake of passing
managedtx=false
Giving new test case showing this

3)-- fix logic of DASImpl.managingConnections() - should just look at
managedtx

4) when connection from DAS and user wants to control single/group of
commands, he should set  managedtx=false

--- new test cases showing manage single/group of Commands

5)DAS will expose getConnection() for all cases except when connection by
DAS, tx management by DAS
--public Connection DAS.getConnection();
For exception case throw RuntimeException from DAS -
DAS is controlling transaction, can not expose Connection!

5)
awhen user passes connection in DAS() and also sets ConnectionInfo
-datasource/drivermanager - specify that passed connection will be used and
config connection will be ignored.

bDAS can manage connection only when it is created internally and
only/Command. i.e. DAS does not support internally managing transactions for
group of commands

-- Document - FAQs?

6) DAS throws RuntimeException with embedded SQLException - may it be
connection closed, integrity violation etc.
---no changes needed

I will submit patch for JIRA-1466 using above summary shortly.
Regards,
Amita
On 8/17/07, Adriano Crestani [EMAIL PROTECTED] wrote:

 forwarding last message to dev list...

 On 8/17/07, Adriano Crestani [EMAIL PROTECTED] wrote:
 
  Hi Amita, thanks for the examples, it always helps to clarify : ). My
  comments:
 
  Use Case 1:
  I think if there is part of the code the user needs to control the
  transaction directly, he would never set the managedtx=true, that's why
  managedtx is an option, to give a chance to the user decide if he wants
 or
  not to control anytime the transaction. So, on my opinion it's an user
 error
  that set the managedtx as true when he wants to control the transaction,
 and
  not a DAS error.
 
  I understand that your point is try to avoid a user mistake like this,
  although the user needs to know well what the DAS interface does or not,
 and
  on this case the DAS interface says: DAS will control the transactions
 when
  you set managedtx=true. This kind of user mistake could be easily
 resolved
  if a Connection object could be easily copied, but as far as I know it
  can't.
 
  Use Case 2:
  Here I agree that not to expose the Connection when its created by DAS
 and
  managedtx is false is a DAS mistake. That's why I vote to expose
  getConnection and I see no problem to throw some kind of exception when
 user
  tries to invoke getConnection when managedtx=true.
 
  Use Case 3:
  a) About user invoking closeConnection, it's the same case I described
 on
  Use Case 1's comments, the user needs to be aware that DAS is
 controlling
  the transactions. However, DAS should throw some kind of exception when
 the
  Connection is closed externally, I don't know if it's doing that.
 
  b) If exposing the getConnection, I do not see anything new in using
 these
  new methods, start/endTransactions, that user cannot perform only using
 a
  Connection object.
 
  c) About data integrity, I think it's also wrong decision if the user
 set
  the managedtx=true if he may further want to perform a rollback on the
 db.
 
  In conclusion:
 
  +1 for exposing getConnection
 
  - for adding methods startTransaction and endTranscation
 
  Regards,
  Adriano Crestani
 
 
  On 8/16/07, Amita Vadhavkar [EMAIL PROTECTED] wrote:
  
   Hi Haleh,
   Please see all the use case details below.
  
   There are three user cases going wrong which I am trying to fix.
  
   I have created a JIRA-1543 to demonstrate with examples how DAS is
   failing
   in these use case scenarios. Patch contains 3 new test cases as below
 in
  
   TransactionTests.java.
   So far TransactionTests.java had only 1 test case and was not enough
 to
   uncover these
   issues.
  
   1) when user passes connection to DAS, it is obvious that user is
   always
   going to have a handle to it and so the only option should be to
 make
   user
   control the transaction. Current DAS code issues commit/rollback /
   Command
   for this case, which is an erroneous behavior. Due to this user loses
   its
   ability to group commands based on business need in a transaction.
   ---check testUserUnableToControlExternallyInitedTransaction()
  
   2) when managedtx=false and connection is created by DAS, NEITHER DAS
   NOR
   USER issue any commit/rollback ANYTIME. This is equaly 

Re: [DAS] Transaction support

2007-08-17 Thread Luciano Resende
By doing a quick debug on Amita's testcase from JIRA-1543, looks like
we might have some bugs in our current code, that might be causing
this whole confusion. Let me spend couple hours on this over the
weekend, and send some feedback after that. I'll also write a wiki
page with what I think the Transaction support should do/work.

On 8/17/07, Amita Vadhavkar [EMAIL PROTECTED] wrote:
 Just trying to see what changes will be needed (marked with )
 1) when connection from user, and he wants to delegate transaction control
 to DAS,
 allow it only per/Command. This will save user from issuing one
 commit/rollback per command in the client code. (i.e. current way of
 managetx=true default, connection passed from user). So this is as of today,
 no changes needed.

 2) when connection from user and user wants to control single/group of
 commands, he should set managedtx=false.
 -As default managedtx=true, user in this case will need to put
 ConnectionInfo element in config just for the sake of passing
 managedtx=false
 Giving new test case showing this

 3)-- fix logic of DASImpl.managingConnections() - should just look at
 managedtx

 4) when connection from DAS and user wants to control single/group of
 commands, he should set  managedtx=false

 --- new test cases showing manage single/group of Commands

 5)DAS will expose getConnection() for all cases except when connection by
 DAS, tx management by DAS
 --public Connection DAS.getConnection();
 For exception case throw RuntimeException from DAS -
 DAS is controlling transaction, can not expose Connection!

 5)
 awhen user passes connection in DAS() and also sets ConnectionInfo
 -datasource/drivermanager - specify that passed connection will be used and
 config connection will be ignored.

 bDAS can manage connection only when it is created internally and
 only/Command. i.e. DAS does not support internally managing transactions for
 group of commands

 -- Document - FAQs?

 6) DAS throws RuntimeException with embedded SQLException - may it be
 connection closed, integrity violation etc.
 ---no changes needed

 I will submit patch for JIRA-1466 using above summary shortly.
 Regards,
 Amita
 On 8/17/07, Adriano Crestani [EMAIL PROTECTED] wrote:
 
  forwarding last message to dev list...
 
  On 8/17/07, Adriano Crestani [EMAIL PROTECTED] wrote:
  
   Hi Amita, thanks for the examples, it always helps to clarify : ). My
   comments:
  
   Use Case 1:
   I think if there is part of the code the user needs to control the
   transaction directly, he would never set the managedtx=true, that's why
   managedtx is an option, to give a chance to the user decide if he wants
  or
   not to control anytime the transaction. So, on my opinion it's an user
  error
   that set the managedtx as true when he wants to control the transaction,
  and
   not a DAS error.
  
   I understand that your point is try to avoid a user mistake like this,
   although the user needs to know well what the DAS interface does or not,
  and
   on this case the DAS interface says: DAS will control the transactions
  when
   you set managedtx=true. This kind of user mistake could be easily
  resolved
   if a Connection object could be easily copied, but as far as I know it
   can't.
  
   Use Case 2:
   Here I agree that not to expose the Connection when its created by DAS
  and
   managedtx is false is a DAS mistake. That's why I vote to expose
   getConnection and I see no problem to throw some kind of exception when
  user
   tries to invoke getConnection when managedtx=true.
  
   Use Case 3:
   a) About user invoking closeConnection, it's the same case I described
  on
   Use Case 1's comments, the user needs to be aware that DAS is
  controlling
   the transactions. However, DAS should throw some kind of exception when
  the
   Connection is closed externally, I don't know if it's doing that.
  
   b) If exposing the getConnection, I do not see anything new in using
  these
   new methods, start/endTransactions, that user cannot perform only using
  a
   Connection object.
  
   c) About data integrity, I think it's also wrong decision if the user
  set
   the managedtx=true if he may further want to perform a rollback on the
  db.
  
   In conclusion:
  
   +1 for exposing getConnection
  
   - for adding methods startTransaction and endTranscation
  
   Regards,
   Adriano Crestani
  
  
   On 8/16/07, Amita Vadhavkar [EMAIL PROTECTED] wrote:
   
Hi Haleh,
Please see all the use case details below.
   
There are three user cases going wrong which I am trying to fix.
   
I have created a JIRA-1543 to demonstrate with examples how DAS is
failing
in these use case scenarios. Patch contains 3 new test cases as below
  in
   
TransactionTests.java.
So far TransactionTests.java had only 1 test case and was not enough
  to
uncover these
issues.
   
1) when user passes connection to DAS, it is obvious that user is
always

Re: [DAS] Transaction support

2007-08-16 Thread Amita Vadhavkar
Hi Haleh,
Please see all the use case details below.

There are three user cases going wrong which I am trying to fix.

I have created a JIRA-1543 to demonstrate with examples how DAS is failing
in these use case scenarios. Patch contains 3 new test cases as below in
TransactionTests.java.
So far TransactionTests.java had only 1 test case and was not enough to
uncover these
issues.

1) when user passes connection to DAS, it is obvious that user is always
going to have a handle to it and so the only option should be to make user
control the transaction. Current DAS code issues commit/rollback / Command
for this case, which is an erroneous behavior. Due to this user loses its
ability to group commands based on business need in a transaction.
---check testUserUnableToControlExternallyInitedTransaction()

2) when managedtx=false and connection is created by DAS, NEITHER DAS NOR
USER issue any commit/rollback ANYTIME. This is equaly wrong. This way the
Transaction control is at the mercy of How DBMS behaves upon  close of a
connection. This can be corrected if getConnection() is exposed.
---check testUnableToCommitTransaction()

3) most important-data integrity violation! When managedtx=true and
Connection is created by DAS, and there are multiple applyChanges() which
need to be in same transaction to ensure data integrity, DAS fails
completely. Here exposing getConnection() won't do, as with this user can
even issue closeConnection() and DAS will not function with that. Instead,
if startTransaction(), endTransaction() are exposed, user will be able to
maintain data integrity based on his demand.
---check testDataIntegrityViolation()
___
Alternative approach will be remove managedtx attribute itself from
config.xsd and let user do whatever  he wants with the connection, in this
case just making sure user has handle to connection (either because he
created it or because of getConnection()) will be enough. i.e. always
delegate transaction control to the caller and don't handle it in DAS.
___
1testUserUnableToControlExternallyInitedTransaction
Scenario:- Stopped Employee department transfer
0) John Jones is in Advanced Technologies(Department1)
1) John Jones is removed from Advanced Technologies
2) User decides to revert the decision and rollsback the transaction

Ideally, it is expected that remove from Department1 (1)) should not have
happened
and John Jones should still be in Department1.

What is found in the end result is John Jones is removed from Department1
even though user has issued rollback.
_
2testUnableToCommitTransaction
Scenario:- Employee department transfer
0) John Jones is in Advanced Technologies(Department1)
1) John Jones is removed from Advanced Technologies
2) John Jones is added to New Technologies(Department2)

DAS Config has ConnectionInfo specified and user does not pass Connection to
DAS. Thus Connection is created by DAS and used in Commands. Also, in DAS
Config ConnectionInfo, managedtx=FALSE is set by user.  This signals DAS to
stop issuing any commit/rollback. Also, as Connection is internally formed
by DAS and not exposed to user, there is no way user can handle
commit/rollback.

After , 0), 1), 2), user assumes that change has happened and John Jones
is removed from Department1 and added to Department2. He creates a new
Connection and a new DAS instance and checks data in  database. When he
issues query using new connection and new DAS ., he gets SQLException
indicating lock could not be obtained on tables of interest and query could
not go thru. This is because  1),2) are not commited by DAS nor user and so
tables remained locked.
___
3testDataIntegrityViolation

Scenario:- Bank account money transter
0) Account1 original balance $1, account2 original balance $500
1) user removes $200 from account1
2) user adds $200 into account2

DAS Config has ConnectionInfo specified and user does not pass Connection to
DAS. Thus Connection is created by DAS and used in Commands. Also, in DAS
Config ConnectionInfo, managedtx=TRUE is set by user.  This signals DAS to
issue commit/rollback/Command. Also, as Connection is internally formed by
DAS and not exposed to user, there is no way user can handle
commit/rollback.

After , 0), 1), there is a network crash during 2) and so 2) does not go
thru, but on the other hand there is a SQLException thrown during 2) due to
which DAS attempts a rollback. Now what is expected is 1) and 2) should both
be rolled back, and account1 and account2 should have old balaces. This will
ensure data integrity.

When user checks data in DBMS, what is found is account1 is $200 

Re: [DAS] Transaction support

2007-08-13 Thread Amita Vadhavkar
-When connection is provider by caller(say container), there is no
meaning
of managedtx attribute, and it is better to let the caller handle the
transactionality of the operations. So, when DAS is instantiated using
external connection - mandate managedtx = false. Also, expose
getConnection() from DAS to give a ref. of the connection (User already owns
it, DAS is just providing ref.). DAS will not issue any commit/rollback

-When connection is created internally, managedtx has a meaning.
1When false, DAS.getConnection() should be exposed and user should be
allowed to handle transactions. DAS should not issue any commits/rollbacks

2When true, do not expose DAS.getConnection().

If TRANSACTION_DEMARCATION_PER_COMMAND is true, work like today (commit
/rollback per command).

If TRANSACTION_DEMARCATION_PER_COMMAND is false (now is time for DAS to
manager group of commands as a sigle transaction).Here, DAS at the simplest
can use a static FLAG  set/unset using methods
- void DAS.startTransaction(), //mark FLAG to set
- void DAS.endTransaction(commit/rollback). //mark FLAG to reset
endTransaction() will issue commit/rollback based on arg passed to it.
For any exception condition DAS will issue rollback() on transaction and
will reset the FLAG.
Client needs to call start/endTransaction() for group of Commands.

Also, here for timeout impelmentation, Java Timer can be used.

Regards,
Amita

On 8/10/07, Adriano Crestani [EMAIL PROTECTED] wrote:

 Hi Amita,

 I think it can be useful to bunch commands, but I didn't get how you are
 planning to do it : (

 What would be the parameter of method getTransaction?

 Regards,
 Adriano Crestani

 On 7/12/07, Amita Vadhavkar [EMAIL PROTECTED] wrote:
 
  Below is a simple matrix based on current RDB DAS Config, showing what
 it
  does/does not
  do today
 
  managedtx(default-true) - config attribute in ConnectionInfo element
 to
  control transactions
 
  managedtx   database conn. supplied effect on transaction
 
 
 --
  1)true   from caller each DAS
 command
  undergoes commit/rollback
  2)false  from within DAS this is not handled
  in
  any way
  3)true   from within DAS each DAS command
  undergoes commit/rollback
  4)false from caller DAS does not issue
  commit/rollback, external caller manages
 
  Case 2) - when database Connection is created in RDB DAS, it does not
  expose
  it to caller
  today. So,   in case 2) neither RDB DAS nor caller can manage
  transactions.
 
  From above, it seems that, RDB DAS in general does not provide support
 to
  handle a group
  of Commands under one database transactions. Only case 4) is the place
  when
  multiple
  DAS Commands can undergo as one transaction.
 
  To help serve the transaction control better, I would like to propose
 the
  following requirements:-
  [1]RDB DAS should have a way to issue commit/rollback for single/group
 of
  Commands
  [2]When there is exception, the ongoing transaction should be
 immediately
  aborted by RDB
 DAS irrespective of whether it was for single/group of Commands
  [3]Optional Timeout feature - to have an escape route to end the
  transaction controlled by
  RDB DAS,  when it seems to linger for time  Timeout (to take care of
  situations like
  deadlocks).
 
 For this, I am thinking of introducing 2 new attributes in RDB DAS
  Config
 A) TRANSACTION_DEMARCATION_PER_COMMAND - true/false (mandatory when
  managedtx=true)
 B) TRANSACTION_TIMEOUT - millis (always optional)
 These 2 attributes can be specified at Config level.
 
  When case 1) or 3) - both these attributes will take effect. When 2) or
  4),
  these will be
  ignored.
 
  To handle case 2) - here user is required to be given handle to the
  database
  Connection,
  created by RDB DAS (in 1) and 3), this should be prohibited, and in 4)
  user
  already has
  handle of the  Connection.) This way, the responsibility of transaction
  management can be
  taken by user for 4)(as it is today) and 2)(as now user will get handle)
 
  For 1) and 3) - TRANSACTION_DEMARCATION_PER_COMMAND=true is already
  working
  in
  RDB DAS today. For handling TRANSACTION_DEMARCATION_PER_COMMAND=false,
  new APIs can be given to user like DAS.getTransaction().commit()
  /rollback() , so in a
  controlled way, user will be able to bunch group of Commands based on
  business logic
  and issue commits/rollbacks. Also, internally, RDB DAS will be
 responsible
  to rollback in
  case of exceptions and in case of Timeouts.
 
  Please share your thoughts.
 
  Regards,
  Amita
 
  On 6/12/07, Amita Vadhavkar [EMAIL PROTECTED] wrote:
  
   Hi All,
   I just want to clarify if the below is something missing in DAS or
 just
   that I have not understood it clearly.
   Appreciate your response.
  
  

Re: [DAS] Transaction support

2007-08-13 Thread Luciano Resende
I think that the main goal of DAS, is to be an heterogeneous API that
could be used to implement support for various backends (rdb, ldap,
xml etc). Starting to add various semantics that might be specific to
RDB might take us out of this direction.

So, for this issue, let's take a step back and think around the
scenarios where this new enhancement might be useful, could you please
list a couple here ? It would be great if you could also mention the
deficiencies you found from managedtx parameter on each scenario.

Also, couple questions :
   - Could you please elaborate more on why you need to expose
DAS.getConnection() ?

   - If you already defined the transaction demarcation flags, why you
still ask the client code to handle start/endTransaction? Why is that
different from passing managedtx = false ?

On 8/13/07, Amita Vadhavkar [EMAIL PROTECTED] wrote:
 -When connection is provider by caller(say container), there is no
 meaning
 of managedtx attribute, and it is better to let the caller handle the
 transactionality of the operations. So, when DAS is instantiated using
 external connection - mandate managedtx = false. Also, expose
 getConnection() from DAS to give a ref. of the connection (User already owns
 it, DAS is just providing ref.). DAS will not issue any commit/rollback

 -When connection is created internally, managedtx has a meaning.
 1When false, DAS.getConnection() should be exposed and user should be
 allowed to handle transactions. DAS should not issue any commits/rollbacks

 2When true, do not expose DAS.getConnection().

 If TRANSACTION_DEMARCATION_PER_COMMAND is true, work like today (commit
 /rollback per command).

 If TRANSACTION_DEMARCATION_PER_COMMAND is false (now is time for DAS to
 manager group of commands as a sigle transaction).Here, DAS at the simplest
 can use a static FLAG  set/unset using methods
 - void DAS.startTransaction(), //mark FLAG to set
 - void DAS.endTransaction(commit/rollback). //mark FLAG to reset
 endTransaction() will issue commit/rollback based on arg passed to it.
 For any exception condition DAS will issue rollback() on transaction and
 will reset the FLAG.
 Client needs to call start/endTransaction() for group of Commands.

 Also, here for timeout impelmentation, Java Timer can be used.

 Regards,
 Amita

 On 8/10/07, Adriano Crestani [EMAIL PROTECTED] wrote:
 
  Hi Amita,
 
  I think it can be useful to bunch commands, but I didn't get how you are
  planning to do it : (
 
  What would be the parameter of method getTransaction?
 
  Regards,
  Adriano Crestani
 
  On 7/12/07, Amita Vadhavkar [EMAIL PROTECTED] wrote:
  
   Below is a simple matrix based on current RDB DAS Config, showing what
  it
   does/does not
   do today
  
   managedtx(default-true) - config attribute in ConnectionInfo element
  to
   control transactions
  
   managedtx   database conn. supplied effect on transaction
  
  
  --
   1)true   from caller each DAS
  command
   undergoes commit/rollback
   2)false  from within DAS this is not handled
   in
   any way
   3)true   from within DAS each DAS command
   undergoes commit/rollback
   4)false from caller DAS does not issue
   commit/rollback, external caller manages
  
   Case 2) - when database Connection is created in RDB DAS, it does not
   expose
   it to caller
   today. So,   in case 2) neither RDB DAS nor caller can manage
   transactions.
  
   From above, it seems that, RDB DAS in general does not provide support
  to
   handle a group
   of Commands under one database transactions. Only case 4) is the place
   when
   multiple
   DAS Commands can undergo as one transaction.
  
   To help serve the transaction control better, I would like to propose
  the
   following requirements:-
   [1]RDB DAS should have a way to issue commit/rollback for single/group
  of
   Commands
   [2]When there is exception, the ongoing transaction should be
  immediately
   aborted by RDB
  DAS irrespective of whether it was for single/group of Commands
   [3]Optional Timeout feature - to have an escape route to end the
   transaction controlled by
   RDB DAS,  when it seems to linger for time  Timeout (to take care of
   situations like
   deadlocks).
  
  For this, I am thinking of introducing 2 new attributes in RDB DAS
   Config
  A) TRANSACTION_DEMARCATION_PER_COMMAND - true/false (mandatory when
   managedtx=true)
  B) TRANSACTION_TIMEOUT - millis (always optional)
  These 2 attributes can be specified at Config level.
  
   When case 1) or 3) - both these attributes will take effect. When 2) or
   4),
   these will be
   ignored.
  
   To handle case 2) - here user is required to be given handle to the
   database
   Connection,
   created by RDB DAS (in 1) and 3), this 

Re: [DAS] Transaction support

2007-08-13 Thread Luciano Resende
Comments inline

On 8/13/07, Amita Vadhavkar [EMAIL PROTECTED] wrote:
 Below is what is happening today:-
 managedtx(default-true) - config attribute in ConnectionInfo element to
 control transactions

 managedtx   database conn. supplied effect on transaction
 --
 1)true  from caller each DAS command undergoes
 commit/rollback
 2)false from within DAS this is not handled in any way
 3)true  from within DAS each DAS command undergoes
 commit/rollback
 4)false from caller DAS does not issue
 commit/rollback, external caller manages

 So what is lacking is
 a ability to issue commit/rollback on group of commands where connection is
 managed by DAS  (managedtx=true).(case 3)). this will be essential to handle
 any business unit work. otherwise DAS is ending up today in mimicking
 autocommit behavior of Database which is not so useful when business
 transactions need to handle a group of operations as one atomic unit

So, the test case below is an example of multiple commands under one
transaction. On this scenario, connection is supplied by client, and I
think this gives you the same results as if the connection was created
by DAS and exposed to client code, and also gives more flexibility to
how the client will aquire the connection, or re-use some other
connection to be part of the same transaction.

[1] 
https://svn.apache.org/repos/asf/incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/TransactionTests.java


 b what is the reason behind providing case 1)? when client/container
 provides connection, it can be controlled by client/container. and even if
 DAS tries to controll it, as user has handle to connection,
 commits/rollbacks can be issued by client async with what DAS is trying to
 control. So there will be no meaning in DAS controlling the connection
 supplied by client. And so there is no meaning to managedtx either.

 c case 2), as of today there is no way to expose connection to client when
 it is created by DAS. so neither DAS nor client manages transaction. For
 this case exposing connection thru getConnection() will be useful (for other
 cases, it can be banned)


In the case where client code requires access to the connection, is
there any issue with supplying it to DAS ?


 d as DAS is heterogeneous API, is the DAS config going to be
 heterogeneous too? If yes, then it will be advantageousto support the
 transactional nature of RDB using such semantics. If the backend (non RDB)
 does not support transaction, this semantics will be of no use, but
 in this case the DAS config can be different (more tuned to that particular
 backend)
 So, it all depends on whether we are following the path to support DAS with
 heterogeneous APIs or not. Will you please elaborate meaning of
 heterogeneous API in context of different flavors of DAS?


Yes, the idea is that each impl would define it's own model,
inheriting from a common root class (xsd element)

 e {If you already defined the transaction demarcation flags...}Where are we
 doing that at present? What is there is only issue commit/rollback at the
 end of each DAS Command. Am I missing some other transaction demarcation
 mechanism already available in DAS?

 Regards,
 Amita

 On 8/13/07, Luciano Resende [EMAIL PROTECTED] wrote:
 
  I think that the main goal of DAS, is to be an heterogeneous API that
  could be used to implement support for various backends (rdb, ldap,
  xml etc). Starting to add various semantics that might be specific to
  RDB might take us out of this direction.
 
  So, for this issue, let's take a step back and think around the
  scenarios where this new enhancement might be useful, could you please
  list a couple here ? It would be great if you could also mention the
  deficiencies you found from managedtx parameter on each scenario.
 
  Also, couple questions :
 - Could you please elaborate more on why you need to expose
  DAS.getConnection() ?
 
 - If you already defined the transaction demarcation flags, why you
  still ask the client code to handle start/endTransaction? Why is that
  different from passing managedtx = false ?
 
  On 8/13/07, Amita Vadhavkar [EMAIL PROTECTED] wrote:
   -When connection is provider by caller(say container), there is no
   meaning
   of managedtx attribute, and it is better to let the caller handle the
   transactionality of the operations. So, when DAS is instantiated using
   external connection - mandate managedtx = false. Also, expose
   getConnection() from DAS to give a ref. of the connection (User already
  owns
   it, DAS is just providing ref.). DAS will not issue any commit/rollback
  
   -When connection is created internally, managedtx has a meaning.
   1When false, DAS.getConnection() should be exposed and user should be
   allowed to handle 

Re: [DAS] Transaction support

2007-07-12 Thread Amita Vadhavkar

Below is a simple matrix based on current RDB DAS Config, showing what it
does/does not
do today

managedtx(default-true) - config attribute in ConnectionInfo element to
control transactions

managedtx   database conn. supplied effect on transaction
--
1)true   from caller each DAS command
undergoes commit/rollback
2)false  from within DAS this is not handled in
any way
3)true   from within DAS each DAS command
undergoes commit/rollback
4)false from caller DAS does not issue
commit/rollback, external caller manages

Case 2) - when database Connection is created in RDB DAS, it does not expose
it to caller
today. So,   in case 2) neither RDB DAS nor caller can manage transactions.


From above, it seems that, RDB DAS in general does not provide support to

handle a group
of Commands under one database transactions. Only case 4) is the place when
multiple
DAS Commands can undergo as one transaction.

To help serve the transaction control better, I would like to propose the
following requirements:-
[1]RDB DAS should have a way to issue commit/rollback for single/group of
Commands
[2]When there is exception, the ongoing transaction should be immediately
aborted by RDB
  DAS irrespective of whether it was for single/group of Commands
[3]Optional Timeout feature - to have an escape route to end the
transaction controlled by
RDB DAS,  when it seems to linger for time  Timeout (to take care of
situations like
deadlocks).

  For this, I am thinking of introducing 2 new attributes in RDB DAS Config
  A) TRANSACTION_DEMARCATION_PER_COMMAND - true/false (mandatory when
managedtx=true)
  B) TRANSACTION_TIMEOUT - millis (always optional)
  These 2 attributes can be specified at Config level.

When case 1) or 3) - both these attributes will take effect. When 2) or 4),
these will be
ignored.

To handle case 2) - here user is required to be given handle to the database
Connection,
created by RDB DAS (in 1) and 3), this should be prohibited, and in 4) user
already has
handle of the  Connection.) This way, the responsibility of transaction
management can be
taken by user for 4)(as it is today) and 2)(as now user will get handle)

For 1) and 3) - TRANSACTION_DEMARCATION_PER_COMMAND=true is already working
in
RDB DAS today. For handling TRANSACTION_DEMARCATION_PER_COMMAND=false,
new APIs can be given to user like DAS.getTransaction().commit()
/rollback() , so in a
controlled way, user will be able to bunch group of Commands based on
business logic
and issue commits/rollbacks. Also, internally, RDB DAS will be responsible
to rollback in
case of exceptions and in case of Timeouts.

Please share your thoughts.

Regards,
Amita

On 6/12/07, Amita Vadhavkar [EMAIL PROTECTED] wrote:


Hi All,
I just want to clarify if the below is something missing in DAS or just
that I have not understood it clearly.
Appreciate your response.


At present, DAS has managedtx attribute at ConnectionInfo level(default
true). So when true
   or not specificed, each Command does a database commit. When false,
external caller is responsible
   for managing transaction.
   There is no way to bunch a set of Commands in one transaction under
control of DAS, it is at the mercy of
   external caller (when managedtx is false). Is it not useful to
introduce this in DAS, wherein,
   when DAS manages transaction, it can have today's behavior (similar to
autocommit)
   or can have a public API which allows client to commit using the
connection associated
   with current DAS instance. This way, when the connection is not passed
from client (but created in DAS,
   using ConnectionInfo and thus not exposed to client), client will have
a way to support real transaction
   (multiple logical bunch of Commands) using DAS?

Regards,
Amita