|
From: Thomas R. <tho...@tr...> - 2004-06-19 14:10:12
|
Ooops, the 10g driver complains about the releaseSavepoint as well -
must have missed that in the log earlier. Still works though.
Thomas
Thomas Risberg wrote:
> Yes, it does work against a 9i db using both 9i (9.2.0.3) and 10g
> drivers. Nice job coding in the "dark" :-)
>
> 9i driver complains about not supporting "releaseSavepoint"
> (java.sql.SQLException: Unsupported feature), but it still seems to
> work. 10g driver had no problems at all.
>
> PostgreSQL (7.4) failed nicely. No support for savepoints.
>
> MS SQL Server (driver 2.2.0029) errored out with a
> "java.lang.AbstractMethodError". It must only support JDBC 2 --
> supportsSavepoints was added in JDBC 3. I added a try/catch for that
> to provide a nicer error.
>
> Any way you can get this to work in a managed environment with JTA :-)
>
> Thomas
>
>
> jürgen höller [werk3AT] wrote:
>
>> Thomas, Alef, Colin, everybody,
>>
>> Motivated by Rod, I've added support for nested transactions to our
>> transaction infrastructure, via the new propagation behavior
>> PROPAGATION_NESTED. The transaction manager needs to open a true
>> nested transaction which can be rolled back individually while still
>> being able to continue with the surrounding transaction.
>>
>> Furthermore, application code can also use custom savepoints: The
>> TransactionStatus interface now has a SavepointManager
>> superinterface, which provides generic means to create savepoints and
>> roll back to them. This is only intended for advanced needs where the
>> declarative nested transaction model is not sufficient.
>>
>> DataSourceTransactionManager implements nested transaction support
>> via JDBC 3.0 Savepoints: basically, create a Savepoint on nested
>> transaction begin, release it on nested transaction commit, roll back
>> to it on nested transaction rollback. Of course,
>> DataSourceTransactionManager is still compatible with JDBC 2.0 if not
>> using nested transactions.
>>
>> HibernateTransactionManager and JdoTransactionManager offer support
>> for JDBC 3.0 Savepoints too, but it's deactivated by default there:
>> Savepoints are just able to roll back the underlying JDBC Connection,
>> not the Session respectively PersistenceManager with its object
>> cache. Savepoints are still useful for JDBC access code that
>> participates in a Hibernate/JDO transaction, though, when used with
>> care.
>>
>> All of this is already fully covered by unit tests. Unfortunately, I
>> don't have a database with savepoint support available here, i.e. no
>> Oracle; so I've just been able to test that it fails nicely against
>> MySQL (on JDK 1.4 and 1.3). Thomas, do you have a chance to test this
>> against a live database?
>>
>> An example for how PROPAGATION_NESTED is supposed to work. Note that
>> the nested transaction sets the rollback-only flag: This should just
>> cause a rollback of the second update statement but still allow the
>> surrounding transaction to commit the first update statement.
>>
>> DataSource ds = ...;
>> final PlatformTransactionManager tm = new
>> DataSourceTransactionManager(ds);
>> final JdbcTemplate jt = new JdbcTemplate(ds);
>>
>> TransactionTemplate tt1 = new TransactionTemplate(tm);
>> tt1.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
>> tt1.execute(new TransactionCallbackWithoutResult() {
>> protected void doInTransactionWithoutResult(TransactionStatus
>> status) {
>> jt.update("first update statement");
>>
>> TransactionTemplate tt1 = new TransactionTemplate(tm);
>>
>> tt1.setPropagationBehavior(TransactionDefinition.PROPAGATION_NESTED);
>> tt1.execute(new TransactionCallbackWithoutResult() {
>> protected void doInTransactionWithoutResult(TransactionStatus
>> status) {
>> jt.update("second update statement");
>> status.setRollbackOnly();
>> }
>> });
>> }
>> });
>>
>> An example for the same effect via manual savepoint management:
>>
>> TransactionTemplate tt1 = new TransactionTemplate(tm);
>> tt1.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
>> tt1.execute(new TransactionCallbackWithoutResult() {
>> protected void doInTransactionWithoutResult(TransactionStatus
>> status) {
>> jt.update("first update statement");
>>
>> Object savepoint = status.createSavepoint();
>> jt.update("second update statement");
>> status.rollbackToSavepoint(savepoint);
>>
>> }
>> });
>>
>> Juergen
>>
>>
>>
>> -------------------------------------------------------
>> This SF.Net email is sponsored by The 2004 JavaOne(SM) Conference
>> Learn from the experts at JavaOne(SM), Sun's Worldwide Java Developer
>> Conference, June 28 - July 1 at the Moscone Center in San Francisco, CA
>> REGISTER AND SAVE! http://java.sun.com/javaone/sf Priority Code NWMGYKND
>> _______________________________________________
>> Springframework-developer mailing list
>> Spr...@li...
>> https://lists.sourceforge.net/lists/listinfo/springframework-developer
>>
>>
>>
>>
>>
>
>
>
> -------------------------------------------------------
> This SF.Net email is sponsored by The 2004 JavaOne(SM) Conference
> Learn from the experts at JavaOne(SM), Sun's Worldwide Java Developer
> Conference, June 28 - July 1 at the Moscone Center in San Francisco, CA
> REGISTER AND SAVE! http://java.sun.com/javaone/sf Priority Code NWMGYKND
> _______________________________________________
> Springframework-developer mailing list
> Spr...@li...
> https://lists.sourceforge.net/lists/listinfo/springframework-developer
>
>
>
|