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 <[email protected]>: > 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 >
