Sylvian, I'm not completely convinced a rewriting of SQLTransformer is needed to handle transactions... I tried the following:
<sql:query isstoredprocedure="false"> name="test"> begin DELETE FROM CRRegion WHERE Id > 80; COMMIT; INSERT INTO CRRegion (Id, Name) VALUES ('90', 'Foo'); INSERT INTO CRRegion (Id, Name) VALUES ('91', 'Bar'); ROLLBACK; end; </sql:query> And it worked just fine (both the commit and the rollback parts). I even tried some variations on this theme and they worked just as well. There is a catch though: I tried on Oracle only. I don't know whether the begin/end statement could be used with other DBMSes. Anyway, I agree the use of a single connection to process the complete input document would increase performance and reduce side-effects. Best regards, P.S. As you may easily imagine, I consider Stored Procedures the only proper place for handling transactions; but, if people cannot/want not go for SPs... let's give them some alternatives. --------------------------------------------- Luca Morandini GIS Consultant [EMAIL PROTECTED] http://utenti.tripod.it/lmorandini/index.html --------------------------------------------- > -----Original Message----- > From: Sylvain Wallez [mailto:[EMAIL PROTECTED]] > Sent: Saturday, December 14, 2002 11:24 PM > To: [EMAIL PROTECTED] > Subject: Re: SQLTransformer and Transactions > > > Daniel Fagerstrom wrote: > > > I'd like to use transactions in the SQLTransformer and tried something > > like: > > > > ... > > <execute-query> > > <query> > > BEGIN; > > </query> > > </execute-query> > > <execute-query> > > <query> > > Do something > > </query> > > </execute-query> > > <execute-query> > > <query> > > Do something that is based on the previous query > > </query> > > </execute-query> > > <execute-query> > > <query> > > COMMIT; > > </query> > > </execute-query> > > ... > > > > This does not work in the current implementation of the SQLTransformer > > as it gets a new connection from the pool for each execute-query and > > all statements within one transactions must be run from the same > > connection. Even worse, as the pooled connections can be reused from > > another pipeline, the same transaction can continue in a completely > > unexpected place for another user. So it might work as expected for a > > single user but in unexpected ways for multiple users. > > > > One way to solve this would be to use the same connection for all > > execute-query in an input xml document. It would still be necessary to > > open new connections for embedded queries, using the ancestor > > functionality. > > > > Another solution would be to introduce a transaction tag and letting > > all queries within it use the same connection and let the start tag > > execute "connection.setAutoCommit(false)" and the end tag execute > > "connection.commit()". Embedded queries must of course still have own > > connections. > > > > Booth solutions requires some rewriting of the connection handling > > code in the SQLTransformer. > > > > As I need transactions in the application I currently work on, I have > > to modify the SQLTransformer to handle it. Is there any problems with > > the above proposed methods? Which one do you prefer? Are there better > > methods? > > > I consider that getting a connection from the pool for each > <execute-query> creates some unnececessary load on the pool. So I would > go for the first solution (use the same connection). > > Other thoughts from the database specialists out there ? > > Sylvain > > -- > Sylvain Wallez Anyware Technologies > http://www.apache.org/~sylvain http://www.anyware-tech.com > { XML, Java, Cocoon, OpenSource }*{ Training, Consulting, Projects } > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, email: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, email: [EMAIL PROTECTED]