Re: spring-jdbc a transakcie

2010-02-17 Tema obsahu Lukas Barton
Pokud se data vejdou do pameti, je lepsi vsechno drzet v pameti a zapsat
behem jedne kratke transakce.
V pripade rizika konkurencnich zmen dat, je vhodne pouzit optimisticke
zamky.
Na konci potom jen uzivatele informujete o vysledku.

  Lukas


2010/2/17 Dusan Zatkovsky 

> > otevrenou transakci dejme tomu pro cely zivotni cyklus nejakeho dialogu -
> > od otevreni a nacteni udaju do nej, během práce s nim, az po ulozeni ...
>
> No, nie je to uplne ten pripad, ale je to podobne. Aplikacia cosi z kadesi
> stahuje a inserti do databazy. Nasledne commituje a konci.
>
> Pokial by v tom bol este nejaky next-next-back-back wizard modifikujuci
> data v
> db a vy nechcete mat partialne zmeny v tej databazi, tak to musite spravit
> dlhou otvorenou transakciou. Databaza je embedded, takze zdroje neriesim...
>
>
> --
> Dusan
>
>
> ... tykajte mi
>


Re: spring-jdbc a transakcie

2010-02-17 Tema obsahu Dusan Zatkovsky
> otevrenou transakci dejme tomu pro cely zivotni cyklus nejakeho dialogu -
> od otevreni a nacteni udaju do nej, během práce s nim, az po ulozeni ...

No, nie je to uplne ten pripad, ale je to podobne. Aplikacia cosi z kadesi 
stahuje a inserti do databazy. Nasledne commituje a konci.

Pokial by v tom bol este nejaky next-next-back-back wizard modifikujuci data v 
db a vy nechcete mat partialne zmeny v tej databazi, tak to musite spravit 
dlhou otvorenou transakciou. Databaza je embedded, takze zdroje neriesim...


-- 
Dusan


... tykajte mi


RE: spring-jdbc a transakcie

2010-02-17 Tema obsahu Holý Jiří
Prominte mi muj hloupy dotaz, ale jsem docela zvedavy - mohl by jste se vice 
rozepsat o zpusobu, jakym chcete onu aplikaci realizovat? Rozhodne nejsem 
odbornik na desktopove aplikace, nicmene zakladni oddeleni vrstev by mělo byt 
vice nez podobne ee. Takhle to na me pusobi, ze chcete mit otevrenou transakci 
dejme tomu pro cely zivotni cyklus nejakeho dialogu - od otevreni a nacteni 
udaju do nej, během práce s nim, az po ulozeni ...

Jiri Holy

-Original Message-
From: konference-boun...@java.cz [mailto:konference-boun...@java.cz] On Behalf 
Of Dusan Msk
Sent: Tuesday, February 16, 2010 5:27 PM
To: Java
Subject: Re: spring-jdbc a transakcie

Urcite precitam.

Aby som nebol za uplneho rebela, popisem asi moju situaciu.

V mojom pripade sa nejedna o ee aplikaciu, ale o desktop aplikaciu. Ta
drzi prave jedno spojenie do databazy uz od main() a na zaver dava
commit a close(). Vsetky operacie mimo main bezia v neznamom poradi,
prevazne su to obsluhy uzivatelskej interakcie. Takze cele je to bud
vsetko, alebo nic. Prave preto nemozem rozumne pouzit @transactional a
moc sa mi ani nechce babrat s xml konfiguraciou springu. V pripade ee
je samozrejme situacia uplne ina.

Pouzijem singleconnectiondatasource, diky.

2010/2/16, Roman Pichlík :
> Jeste jsem chtel upozornit, ze pokud budete ty transakce resit, tak
> hned na prvni veci si rozbijete hubu. Ta vec se jmenuje vnorene
> transakce. Jakmile bude chtit rozjet nekde nahore (v business logice)
> transakci a chtit, aby v ni nejake spodni vrstvy pokracovaly, tak se
> vas kod neuveritelne zneprehledni. V pripade tech abstrakci, ktere vam
> ted vadi, se o to vubec nestarate. Mimochodem na tema abstrakci napsal
> Lukas Krecan vyborny clanek
> http://blog.krecan.net/2010/02/02/slava-abstrakci/ ten bych vam taky
> doporucoval precist ;-).
>
>
> 2010/2/16 Dusan Zatkovsky :
>> On Tuesday 16 of February 2010 16:57:49 Roman Pichlík wrote:
>>
>>> evidentne jste to poradne nepochopil.
>>
>> To je viac ako iste. Asi som stara skola a na pracu s databazou sa pozeram
>> z
>> pohladu tej databazy. Prehnana miera abstrakcie mi v tomto pripade dost
>> znacne vadi v pochopeni danej temy.
>>
>>> Zkuste si udelat jednoduchy
>>> priklad rizeni transakci pomoci anotaci a potom pomoci kodu obe ve
>>> Springu. Rozhodne tam nebudete mit tuny balastu v podobe XML. To XML
>>> se vem vejde do deseti radku to se klidne vsadim ;-).
>>
>> Urcite to tak spravim akonahle zostane trocha casu.
>>
>>
>> --
>> Dusan
>>
>
>
>
> --
> S pozdravem Roman "Dagi" Pichlik
>
> /* http://www.sweb.cz/pichlik/ Blog pro kodery */
>


Re: spring-jdbc a transakcie

2010-02-16 Tema obsahu Dusan Msk
Urcite precitam.

Aby som nebol za uplneho rebela, popisem asi moju situaciu.

V mojom pripade sa nejedna o ee aplikaciu, ale o desktop aplikaciu. Ta
drzi prave jedno spojenie do databazy uz od main() a na zaver dava
commit a close(). Vsetky operacie mimo main bezia v neznamom poradi,
prevazne su to obsluhy uzivatelskej interakcie. Takze cele je to bud
vsetko, alebo nic. Prave preto nemozem rozumne pouzit @transactional a
moc sa mi ani nechce babrat s xml konfiguraciou springu. V pripade ee
je samozrejme situacia uplne ina.

Pouzijem singleconnectiondatasource, diky.

2010/2/16, Roman Pichlík :
> Jeste jsem chtel upozornit, ze pokud budete ty transakce resit, tak
> hned na prvni veci si rozbijete hubu. Ta vec se jmenuje vnorene
> transakce. Jakmile bude chtit rozjet nekde nahore (v business logice)
> transakci a chtit, aby v ni nejake spodni vrstvy pokracovaly, tak se
> vas kod neuveritelne zneprehledni. V pripade tech abstrakci, ktere vam
> ted vadi, se o to vubec nestarate. Mimochodem na tema abstrakci napsal
> Lukas Krecan vyborny clanek
> http://blog.krecan.net/2010/02/02/slava-abstrakci/ ten bych vam taky
> doporucoval precist ;-).
>
>
> 2010/2/16 Dusan Zatkovsky :
>> On Tuesday 16 of February 2010 16:57:49 Roman Pichlík wrote:
>>
>>> evidentne jste to poradne nepochopil.
>>
>> To je viac ako iste. Asi som stara skola a na pracu s databazou sa pozeram
>> z
>> pohladu tej databazy. Prehnana miera abstrakcie mi v tomto pripade dost
>> znacne vadi v pochopeni danej temy.
>>
>>> Zkuste si udelat jednoduchy
>>> priklad rizeni transakci pomoci anotaci a potom pomoci kodu obe ve
>>> Springu. Rozhodne tam nebudete mit tuny balastu v podobe XML. To XML
>>> se vem vejde do deseti radku to se klidne vsadim ;-).
>>
>> Urcite to tak spravim akonahle zostane trocha casu.
>>
>>
>> --
>> Dusan
>>
>
>
>
> --
> S pozdravem Roman "Dagi" Pichlik
>
> /* http://www.sweb.cz/pichlik/ Blog pro kodery */
>


Re: spring-jdbc a transakcie

2010-02-16 Tema obsahu Roman Pichlík
Jeste jsem chtel upozornit, ze pokud budete ty transakce resit, tak
hned na prvni veci si rozbijete hubu. Ta vec se jmenuje vnorene
transakce. Jakmile bude chtit rozjet nekde nahore (v business logice)
transakci a chtit, aby v ni nejake spodni vrstvy pokracovaly, tak se
vas kod neuveritelne zneprehledni. V pripade tech abstrakci, ktere vam
ted vadi, se o to vubec nestarate. Mimochodem na tema abstrakci napsal
Lukas Krecan vyborny clanek
http://blog.krecan.net/2010/02/02/slava-abstrakci/ ten bych vam taky
doporucoval precist ;-).


2010/2/16 Dusan Zatkovsky :
> On Tuesday 16 of February 2010 16:57:49 Roman Pichlík wrote:
>
>> evidentne jste to poradne nepochopil.
>
> To je viac ako iste. Asi som stara skola a na pracu s databazou sa pozeram z
> pohladu tej databazy. Prehnana miera abstrakcie mi v tomto pripade dost
> znacne vadi v pochopeni danej temy.
>
>> Zkuste si udelat jednoduchy
>> priklad rizeni transakci pomoci anotaci a potom pomoci kodu obe ve
>> Springu. Rozhodne tam nebudete mit tuny balastu v podobe XML. To XML
>> se vem vejde do deseti radku to se klidne vsadim ;-).
>
> Urcite to tak spravim akonahle zostane trocha casu.
>
>
> --
> Dusan
>



-- 
S pozdravem Roman "Dagi" Pichlik

/* http://www.sweb.cz/pichlik/ Blog pro kodery */


Re: spring-jdbc a transakcie

2010-02-16 Tema obsahu Dusan Zatkovsky
On Tuesday 16 of February 2010 16:57:28 Kamil Podlesak wrote:
> Ano, prostě použijte:
  org.springframework.jdbc.datasource.SingleConnectionDataSource
> Samozřejmě při růstu aplikace za chvíli narazíte, ale to můžete řešit
> dodatečně.

Diky


-- 
Dusan


Re: spring-jdbc a transakcie

2010-02-16 Tema obsahu Dusan Zatkovsky
On Tuesday 16 of February 2010 16:57:49 Roman Pichlík wrote:

> evidentne jste to poradne nepochopil.

To je viac ako iste. Asi som stara skola a na pracu s databazou sa pozeram z 
pohladu tej databazy. Prehnana miera abstrakcie mi v tomto pripade dost 
znacne vadi v pochopeni danej temy.

> Zkuste si udelat jednoduchy 
> priklad rizeni transakci pomoci anotaci a potom pomoci kodu obe ve
> Springu. Rozhodne tam nebudete mit tuny balastu v podobe XML. To XML
> se vem vejde do deseti radku to se klidne vsadim ;-).

Urcite to tak spravim akonahle zostane trocha casu.


-- 
Dusan


Re: spring-jdbc a transakcie

2010-02-16 Tema obsahu Roman Pichlík
> Mozem pouzivat spring-jdbc a vyuzivat jeho vyhody ( generiky v *template, row
> mappery a tak podobne ) a zaroven riadit transakcie rucne, bez roznych
> wrapperov, anotacii a uchylnych xml?

muzete, ale je to cesta do pekel

> Pretoze po preluskani vsemoznej dokumentacie a examplov tu uvedenych som
> dospel k zaveru, ze usetrene 4 riadky kodu (vypustenim PreparedStatement-u a
> try-catch) musim nahradit 50timi riadkami roznych wrapperov, callbackov a xml
> a este bohvie ako to konfigurovat (@Transactional), aby to vobec chodilo. Do
> toho sa mi fakt moc nechce ... :)

evidentne jste to poradne nepochopil. Zkuste si udelat jednoduchy
priklad rizeni transakci pomoci anotaci a potom pomoci kodu obe ve
Springu. Rozhodne tam nebudete mit tuny balastu v podobe XML. To XML
se vem vejde do deseti radku to se klidne vsadim ;-).



-- 
S pozdravem Roman "Dagi" Pichlik

/* http://www.sweb.cz/pichlik/ Blog pro kodery */


Re: spring-jdbc a transakcie

2010-02-16 Tema obsahu Kamil Podlesak
Ano, prostě použijte:

 org.springframework.jdbc.datasource.SingleConnectionDataSource

Samozřejmě při růstu aplikace za chvíli narazíte, ale to můžete řešit dodatečně.

Kamil Podlešák

2010/2/16 Dusan Zatkovsky :
> OK, presiel som to vsetko 3x a som na zaciatku.
>
> Skusim teda este raz:
>
> Mozem pouzivat spring-jdbc a vyuzivat jeho vyhody ( generiky v *template, row
> mappery a tak podobne ) a zaroven riadit transakcie rucne, bez roznych
> wrapperov, anotacii a uchylnych xml?
>
> Pretoze po preluskani vsemoznej dokumentacie a examplov tu uvedenych som
> dospel k zaveru, ze usetrene 4 riadky kodu (vypustenim PreparedStatement-u a
> try-catch) musim nahradit 50timi riadkami roznych wrapperov, callbackov a xml
> a este bohvie ako to konfigurovat (@Transactional), aby to vobec chodilo. Do
> toho sa mi fakt moc nechce ... :)
>
> Diky.
>
>> Pokud se volají z jedné metody označené jako @Transactional,
>> tak budou všechny v jedné transakci. Tj. klidně to může vypadat nějak
>> takto:
>>
>> @Transactional
>> public void hlavni(Nahrada nove) {
>>   Neco neco = najit();
>>   smazat(neco);
>>   vlozit(nove);
>> }
>>
>> Makub
>
>
>
> --
> Dusan
>


Re: spring-jdbc a transakcie

2010-02-16 Tema obsahu Dusan Zatkovsky
OK, presiel som to vsetko 3x a som na zaciatku.

Skusim teda este raz:

Mozem pouzivat spring-jdbc a vyuzivat jeho vyhody ( generiky v *template, row 
mappery a tak podobne ) a zaroven riadit transakcie rucne, bez roznych 
wrapperov, anotacii a uchylnych xml?

Pretoze po preluskani vsemoznej dokumentacie a examplov tu uvedenych som 
dospel k zaveru, ze usetrene 4 riadky kodu (vypustenim PreparedStatement-u a 
try-catch) musim nahradit 50timi riadkami roznych wrapperov, callbackov a xml 
a este bohvie ako to konfigurovat (@Transactional), aby to vobec chodilo. Do 
toho sa mi fakt moc nechce ... :)

Diky.

> Pokud se volají z jedné metody označené jako @Transactional,
> tak budou všechny v jedné transakci. Tj. klidně to může vypadat nějak
> takto:
>
> @Transactional
> public void hlavni(Nahrada nove) {
>   Neco neco = najit();
>   smazat(neco);
>   vlozit(nove);
> }
>
> Makub



-- 
Dusan


Re: spring-jdbc a transakcie

2010-02-16 Tema obsahu Roman Pichlík
@Repository
public class Foo {

   @Autowired
   private Datasource datasource;

   @Autowired
   private PlatformTransactionManager transactionManager;


   public void doSomethingInTransaction(){
   final JdbcTemplate jdbc = new JdbcTemplate(datasource);
   TransactionTemplate tt = new TransactionTemplate(transactionManager);
   tt.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
jdbc.update("update blabla");
jdbc.update("update blabla");
return null;
}
});
   }
}

Oba updaty budou v transakci. Rollback se dela automaticky pri
vyhozeni Runtime vyjimku, programove se da zavolat na status zavolanim
metody setRollbackOnly. Ve vasem pripade je potreba brat na zretel, ze
DDL prikazy (drop, create, alter) jedou v autocommit modu, takze po
kazdem prikazu je commit nebo v pripade vyjimky rollback. Takze tam
vam zadne cachrovani s transakcema nepomuze.


-- 
S pozdravem Roman "Dagi" Pichlik

/* http://www.sweb.cz/pichlik/ Blog pro kodery */


Re: spring-jdbc a transakcie

2010-02-16 Tema obsahu Martin Kuba
Dusan Zatkovsky napsal(a):
> On Tuesday 16 of February 2010 11:44:22 Martin Kuba wrote:
> 
>> Vyráběl jsem onehdy tutoriál, je tady:
>> http://kore.fi.muni.cz:5080/wiki/index.php/Spring_JDBC#Transakce
> 
> No, tam je ale vsetok jdbc kod v jednej metode.
> 
> Co ak je dana transakcia rozbita na mnoho volani roznych tried? V jdbc dane 
> triedy zdielaju jednu connection, takze mozem v jednej metode spravit insert, 
> v druhej delete, v tretej update a ak to prezije az do stvrtej, tak to 
> commitnut?

Pokud se volají z jedné metody označené jako @Transactional,
tak budou všechny v jedné transakci. Tj. klidně to může vypadat nějak takto:

@Transactional
public void hlavni(Nahrada nove) {
  Neco neco = najit();
  smazat(neco);
  vlozit(nove);
}

Makub
-- 
~~
Supercomputing Center Brno Martin Kuba
Institute of Computer Scienceemail: ma...@ics.muni.cz
Masaryk University http://www.ics.muni.cz/~makub/
Botanicka 68a, 60200 Brno, CZ mobil: +420-603-533775
--



smime.p7s
Description: S/MIME Cryptographic Signature


Re: spring-jdbc a transakcie

2010-02-16 Tema obsahu Lukas Barton
Pokud mate transakce na business vrstve a vsechno spravne nastavite, tak se
Spring postara o to, ze tam to spojeni bude jenom jedno a jenom jedna
transakce (teda pokud vsechno bude v ramci jednoho vlakna).

  Lukas

2010/2/16 Dusan Zatkovsky 

> On Tuesday 16 of February 2010 11:44:22 Martin Kuba wrote:
>
> > Vyráběl jsem onehdy tutoriál, je tady:
> > http://kore.fi.muni.cz:5080/wiki/index.php/Spring_JDBC#Transakce
>
> No, tam je ale vsetok jdbc kod v jednej metode.
>
> Co ak je dana transakcia rozbita na mnoho volani roznych tried? V jdbc dane
> triedy zdielaju jednu connection, takze mozem v jednej metode spravit
> insert,
> v druhej delete, v tretej update a ak to prezije az do stvrtej, tak to
> commitnut?
>
>
> --
> Dusan
>
>
> ... tykajte mi
>


Re: spring-jdbc a transakcie

2010-02-16 Tema obsahu Dusan Zatkovsky
On Tuesday 16 of February 2010 11:44:22 Martin Kuba wrote:

> Vyráběl jsem onehdy tutoriál, je tady:
> http://kore.fi.muni.cz:5080/wiki/index.php/Spring_JDBC#Transakce

No, tam je ale vsetok jdbc kod v jednej metode.

Co ak je dana transakcia rozbita na mnoho volani roznych tried? V jdbc dane 
triedy zdielaju jednu connection, takze mozem v jednej metode spravit insert, 
v druhej delete, v tretej update a ak to prezije az do stvrtej, tak to 
commitnut?


-- 
Dusan


... tykajte mi


Re: spring-jdbc a transakcie

2010-02-16 Tema obsahu Kamil Podlesak
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 :
> 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
>


Re: spring-jdbc a transakcie

2010-02-16 Tema obsahu Ladislav Thon
Onehdá jsem řešil, jak použít springové deklarativní transakce
(@Transactional) bez použití springového kontejneru. Prostě čisté
spring-jdbc. Kupodivu to není žádná velká magie, takže jestli to někoho
zajímá, tady to je.

Mějme rozhraní SomeService:

public interface SomeService {
  void doSomething();
}

a jeho implementaci:

final class SomeServiceImpl() {
  private final JdbcTemplate jdbc;

  SomeServiceImpl(JdbcTemplate jdbc) {
this.jdbc = jdbc;
  }

  @Transactional // !!!
  void doSomething() {
...
  }
}

To zajímavé se odehrává tady:

public final class ServicesFactory {
  private ServicesFactory() {}

  private static final SomeService SOME_SERVICE;
  static {
// nad implementaci SomeServiceImpl vytvorim springovou transakcni proxy
rizenou
// anotacemi (staci reflect.Proxy nad rozhranim SomeService, neni treba
pouzit cglib)
DataSource dataSource = ...;
SomeServiceImpl target = new SomeServiceImpl(new
JdbcTemplate(dataSource));
PlatformTransactionManager txManager = new
DataSourceTransactionManager(dataSource);
TransactionProxyFactoryBean proxyFactory = new
TransactionProxyFactoryBean();
proxyFactory.setTarget(target); // rozhrani, ktera proxovat, si factory
zjisti sama
proxyFactory.setTransactionManager(txManager);
proxyFactory.setTransactionAttributeSource(new
AnnotationTransactionAttributeSource());
proxyFactory.afterPropertiesSet();
SomeService impl = (SomeService) proxyFactory.getObject();
SOME_SERVICE = impl;
  }

  public static SomeService someService() {
return SOME_SERVICE;
  }
}

LT


2010/2/16 Martin Kuba 

> Dusan Zatkovsky napsal(a):
> > 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?
>
> Vyráběl jsem onehdy tutoriál, je tady:
> http://kore.fi.muni.cz:5080/wiki/index.php/Spring_JDBC#Transakce
>
> Makub
> --
> ~~
> Supercomputing Center Brno Martin Kuba
> Institute of Computer Scienceemail: ma...@ics.muni.cz
> Masaryk University 
> http://www.ics.muni.cz/~makub/
> Botanicka 68a, 60200 Brno, CZ mobil: +420-603-533775
> --
>
>


Re: spring-jdbc a transakcie

2010-02-16 Tema obsahu Lukas Barton
Doporucil bych ridit transakce deklarativne pomoci anotaci (pripadne
konfigurace v XML) mimo perzistentni vrstvu - ta by mela transakce jen
propagovat, nikoliv ridit.
Nastaveni viz:
http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html

Pokud chcete transakce ridit programove, tak je nejlepsi zkombinovat
JdbcTemplate a TransactionTemplate.
Prime volani transaction manageru je taky mozne, ale ponekud neprehledne,

  Lukas

2010/2/16 Dusan Zatkovsky 

> 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
>


Re: spring-jdbc a transakcie

2010-02-16 Tema obsahu Martin Kuba
Dusan Zatkovsky napsal(a):
> 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?

Vyráběl jsem onehdy tutoriál, je tady:
http://kore.fi.muni.cz:5080/wiki/index.php/Spring_JDBC#Transakce

Makub
-- 
~~
Supercomputing Center Brno Martin Kuba
Institute of Computer Scienceemail: ma...@ics.muni.cz
Masaryk University http://www.ics.muni.cz/~makub/
Botanicka 68a, 60200 Brno, CZ mobil: +420-603-533775
--



smime.p7s
Description: S/MIME Cryptographic Signature


spring-jdbc a transakcie

2010-02-16 Tema obsahu Dusan Zatkovsky
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