spring-jdbc a transakcie
Kamil Podlesak
kamil.podlesak na gmail.com
Úterý Únor 16 12:12:45 CET 2010
Zdravím,
První chyba je v tom, že to děláte špatně i v "čistém" JDBC a
používáte nestandardní a nepřenosné příkazy BEGIN/COMMIT/ROLLBACK.
Používejte přímo metody commit a rollback, když už (BEGIN je zcela
zbytečné, transakce začíná prvním příkazem po commit nebo rollback).
No a k samotnému problému: je tam několik možných příčin, jako bych
viděl že ta transakce je nejspíš autocommit a ten
org.h2.jdbcx.JdbcDataSource vůbec neumožňuje ho vypnout. Ten fígl s
getConnection().setAutoCommit(false) rozhodně nebude fungovat - každé
volání getConnection() vrátí novou instanci, viz zdrojáky.
Jako jiný fígl by mohlo zafungovat vytvoření
org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy jako
wrapperu.
Korektní je použít nějaký connection pool (commons-dbcp, c3p0).
Je možné použít řízení transakcí Springem, jak již zde padlo, ale to
bude výrazně (a možná zbytečně) složitější.
Kamil Podlešák
2010/2/16 Dusan Zatkovsky <msk.conf na gmail.com>:
> Ahoj.
>
> Vzhladom na to, ze vsade na nete narazam na nazor, ze priamo s JDBC pracuje len hazarder
> a mal by sa pouzit aspon spring-jdbc, snazim sa s nim nejak zoznamit.
>
> V niektorych veciach sa mi vcelku paci a dokaze co-to ulahcit,
> ale zapasim s transakciami. V cistom jdbc je to jednoduche:
>
> Connection c = ...;
>
> c.execute("begin");
> try {
> c.execute...
> c.execute...
> c.execute...
> c.execute...
> c.execute("commit"); // alebo rollback
> } catch () {
> c.execute("rollback");
> }
>
> S pomocou JdbcTemplate to ale nefunguje:
>
> org.h2.jdbcx.JdbcDataSource ds = new JdbcDataSource();
> ds.setURL("jdbc:h2:/tmp/test");
>
> JdbcTemplate t = new JdbcTemplate(ds);
> t.getDataSource().getConnection().setAutoCommit(false);
>
>
> t.execute("drop table if exists data;");
> t.execute("create table if not exists data ( id integer, name varchar);");
>
> t.update("insert into data values ( 1, 'name1');");
> showTable(t);
>
> t.execute("begin");
>
> t.update("insert into data values ( 2, 'name2');");
> showTable(t);
>
> t.execute("rollback");
>
> showTable(t);
>
>
> Vystup:
>
> [{ID=1, NAME=name1}]
> [{ID=1, NAME=name1}, {ID=2, NAME=name2}]
> [{ID=1, NAME=name1}, {ID=2, NAME=name2}]
>
> Rollback bol ignorovany, pravdepodobne aj begin transaction.
> Bud som nespravnym sposobom naivne nastavil autocommit,
> alebo JdbcTemplate robi nejake dalsie harakiri s connection, ktore moc nechapem.
>
> Problem je, ze nikde na webe nemozem najst nejaky JEDNODUCHY navod,
> ako na transakcie so spring-jdbc. Nasiel som len kopu otazok bez odpovedi, pripadne
> odpovede s linkom na kopu xml chaosu a stovky riadkov mne nepochopitelneho kodu:
>
> http://static.springsource.org/spring/docs/2.5.x/reference/transaction.html
>
> Poradi niekto?
>
> Dik
>
> --
> Dusan
>
Další informace o konferenci Konference