The differences between JDBC and EXTERNAL are simply that EXTERNAL does NOTHING when commit and rollback are called (which works for 99% of managed transaction containers).
http://svn.apache.org/repos/asf/ibatis/trunk/java/ibatis-2/ibatis-2-core/src/com/ibatis/sqlmap/engine/transaction/external/ExternalTransaction.java Scroll to the bottom and look at the commit and rollback methods. Now look at the JDBC transaction: http://svn.apache.org/repos/asf/ibatis/trunk/java/ibatis-2/ibatis-2-core/src/com/ibatis/sqlmap/engine/transaction/jdbc/JdbcTransaction.java You'll see that it forwards the commit and rollback calls to the connection, as if you had called connection.commit()/.rollback() yourself. The JTA transaction manager is quite a bit different and takes an active role in a managed or distributed transaction, and will actually call commit and rollback on the configured transaction if called upon to do so. http://svn.apache.org/repos/asf/ibatis/trunk/java/ibatis-2/ibatis-2-core/src/com/ibatis/sqlmap/engine/transaction/jta/JtaTransaction.java So I agree with everyone here, that EXTERNAL is what you want for managed transactions. JDBC is what you want for unmanaged (i.e. programmatic) transactions. If your app is inconsistent, then you need two SqlMapConfig files (which can share the same SQL Maps), and two instances of SqlMapClient. There's no way for iBATIS to manage that inconsistency for you. Cheers, Clinton On Fri, Oct 3, 2008 at 4:29 PM, Chema <[EMAIL PROTECTED]> wrote: > OK, I'll try it. > > But I've got a doubt. > There is code into my application that runs over JBoss but it doesn't > have transactions managed by application server. > For example, all classes stored in a deployed WAR file. > > In this case, I wouldn't like to delegate to an EXTERNAL tx manager, > would commitTransaction() work fine ? > > So, the only difference between EXTERNAL and JDBC tx manager type is > autocommit configuration ? > > > > > > 2008/10/3 Jeff Butler <[EMAIL PROTECTED]>: > > I'll try one more time - it IS possible if you use the EXTERNAL > > transaction manager. Give it a try - surely it wouldn't take more > > than 5 minutes of your time to try it??? > > > > Jeff Butler > > > > On Fri, Oct 3, 2008 at 4:03 PM, Chema <[EMAIL PROTECTED]> wrote: > >> I guess it's not possible. > >> I 'm going to use JDBC API, I guess > >> > >> Thank you very much !! > >> > >> > >> 2008/10/3 Kai Grabfelder <[EMAIL PROTECTED]>: > >>> Jeff is totaly right, with this configuration iBATIS will never take > part in the container managed transactions... > >>> > >>> > >>> --- Original Nachricht --- > >>> Absender: Jeff Butler > >>> Datum: 03.10.2008 21:14 > >>>> I think you should use EXTERNAL transaction manager - this is EXACTLY > >>>> why it exists. JBOSS, not iBATIS, is your transaction manager in this > >>>> case. > >>>> > >>>> Jeff Butler > >>>> > >>>> On Fri, Oct 3, 2008 at 2:05 PM, Chema <[EMAIL PROTECTED]> wrote: > >>>>> I don't want to keep the secret :-D > >>>>> > >>>>> > >>>>> <settings > >>>>> cacheModelsEnabled="true" > >>>>> enhancementEnabled="true" > >>>>> maxSessions="128" > >>>>> maxTransactions="64" > >>>>> maxRequests="512"/> > >>>>> > >>>>> <transactionManager type="JDBC"> > >>>>> <dataSource type="JNDI"> > >>>>> <property name="DataSource" value="java:/datasource"/> > >>>>> </dataSource> > >>>>> </transactionManager> > >>>>> > >>>>> > >>>>> No more. > >>>>> And like you said, I don't use an EXTERNAL tx manager, but JDBC type > >>>>> > >>>>> I think that the only solution is perform "delete" sentences by JDBC > >>>>> API , so don't commit current transaction (managed by application > >>>>> server). > >>>>> What do you think ? > >>>>> > >>>>> > >>>>> > >>>>> > >>>>> 2008/10/3 Jeff Butler <[EMAIL PROTECTED]>: > >>>>>> iBATIS will not call commit() if you have > >>>>>> > >>>>>> <transactionManager type="EXTERNAL"> > >>>>>> ... > >>>>>> </transactionManager> > >>>>>> > >>>>>> I'm guessing this is NOT what you have configured - but it would be > >>>>>> nice to see your configuration. > >>>>>> > >>>>>> Jeff Butler > >>>>>> > >>>>>> On Fri, Oct 3, 2008 at 1:44 PM, Chema <[EMAIL PROTECTED]> wrote: > >>>>>>> I can't upgrade because my application runs over JVM 1.4 and iBatis > >>>>>>> 2.3.0 is the last release compatible with JVM 1.4 > >>>>>>> > >>>>>>> About your question, from documentation: > >>>>>>> > >>>>>>> "The <transactionManager> element also allows an optional attribute > >>>>>>> commitRequired that can be true or > >>>>>>> false. Normally iBATIS will not commit transactions unless an > insert, > >>>>>>> update, or delete operation has been performed > >>>>>>> [...] > >>>>>>> The startTransaction(), commitTransaction() and endTransaction() > >>>>>>> methods, they will all be called > >>>>>>> automatically for you whenever you execute a statement outside of a > >>>>>>> transactional block as demonstrated in > >>>>>>> the above." > >>>>>>> > >>>>>>> I think it's not by cause of my configuration > >>>>>>> > >>>>>>> Thanks ! > >>>>>>> > >>>>>>> Regards > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> 2008/10/3 Kai Grabfelder <[EMAIL PROTECTED]>: > >>>>>>>> sqlMap.delete() performs a commit? That should not be the case if > the tx manager is configured correctly. > >>>>>>>> Whats your configuration? Could you please also try updating > ibatis to 2.3.4, 2.3.0 is really old... > >>>>>>>> > >>>>>>>> Regards > >>>>>>>> > >>>>>>>> Kai > >>>>>>>> > >>>>>>>> --- Original Nachricht --- > >>>>>>>> Absender: Chema > >>>>>>>> Datum: 03.10.2008 15:01 > >>>>>>>>> That doesn't work because sqlMap.delete() performs commit > automatically. > >>>>>>>>> I'm using the transaction manager of JBoss , with JNDI/JDBC. > >>>>>>>>> Can I disabled this ? By code is not possible because Jboss TX > manager > >>>>>>>>> throws a SQLExeception. > >>>>>>>>> Another w/a ? > >>>>>>>>> > >>>>>>>>> Thanls ! > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> 2008/10/3 Kai Grabfelder <[EMAIL PROTECTED]>: > >>>>>>>>>> if you are using CTM (container managed transactions), like in > your case, you can't start, commit or end > >>>>>>>>>> transactions manually. The container is doing this for you. > >>>>>>>>>> > >>>>>>>>>> The following should work > >>>>>>>>>>> sqlMap.delete("deleteRecords", param); > >>>>>>>>>> > >>>>>>>>>> If it does not I think your sqlmap configuration is not correct. > Could you post it here? > >>>>>>>>>> > >>>>>>>>>> Regards > >>>>>>>>>> > >>>>>>>>>> Kai > >>>>>>>>>> > >>>>>>>>>> --- Original Nachricht --- > >>>>>>>>>> Absender: Chema > >>>>>>>>>> Datum: 03.10.2008 12:53 > >>>>>>>>>>> Hello: > >>>>>>>>>>> > >>>>>>>>>>> I'm using JBoss 3.2 and EJB 2.0 with iBatis 2.3.0 > >>>>>>>>>>> I've got configured a external transaction manager in SQLMap > >>>>>>>>>>> configuration file. > >>>>>>>>>>> > >>>>>>>>>>> When an EJB component ( session bean ) tries to delete record > using by > >>>>>>>>>>> iBatis sqlMap client, JBoss retrieve this > >>>>>>>>>>> error: > >>>>>>>>>>> > >>>>>>>>>>> 11:02:09,406 ERROR [Connection] Error calling > Connection.commit: > >>>>>>>>>>> java.sql.SQLException: You cannot commit during a managed > transaction! > >>>>>>>>>>> at > org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.jdbcCommit(BaseWrapperManagedConnection.java:525) > >>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>>> This error happens when I perform this > >>>>>>>>>>> > >>>>>>>>>>> sqlMap.startTransaction(); > >>>>>>>>>>> sqlMap.delete("deleteRecords", param); > >>>>>>>>>>> sqlMap.commitTransaction(); > >>>>>>>>>>> sqlMap.endTransaction(); > >>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>>> And with a single call (automatic transaction): > >>>>>>>>>>> > >>>>>>>>>>> sqlMap.delete("deleteRecords", param); > >>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>>> I would like to delegate all transaction issues to external > >>>>>>>>>>> transaction manager ( in this case, JBoss) > >>>>>>>>>>> How I can solved this ? Any w/a ? > >>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>>> Thanks !! > >>>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>> > >>>>>> > >>>>> > >>>> > >>> > >>> > >> > > >
