Avatar billede tien Nybegynder
28. juni 2002 - 13:04 Der er 15 kommentarer og
1 løsning

Transaction

Jeg skal indarbejde noget transaction styring i mit program.
Men jeg er ikke lige helt klar over hvad, hvordan og hvorledes!?

I mit program har jeg en abstract table klasse der varetager alle database relaterede funktioner (insert, update, delete...). Det er også her der laves connection til databasen for hver gang en database funktion udføres. For hver tabel i min database har jeg en klasse, som arver fra min abstract table klasse, til at administrere de enkelte tabeller.

Det jeg skal have indarbejdet i forbindelse med udførelse af en insert-sætning er at inserte i 2 forskellige tabeller. Denne udførelse skulle meget gerne være indkapslet i en transaction!? - alt eller intet princip!
Hvordan skal jeg gøre dette?
Avatar billede disky Nybegynder
28. juni 2002 - 13:36 #1
Kig lige her:
http://www.fawcette.com/javapro/archives/bs0999/

En rigtig god tutorial om lige netop dit problem.

Håber den hjælper.
Avatar billede disky Nybegynder
28. juni 2002 - 13:38 #2
Det du gør er følgende:
conn.setAutoCommit(false);
sql = "UPDATE" + tablename +
    " SETBALANCE = "+ balance +
    " WHEREACCTNUM = "+ accountnum;
stmt.executeUpdate(sql);
tablename=tableNames [totype];
sql = "UPDATE  " + tablename+
    " SETBALANCE = BALANCE + " +
    amount + "WHEREACCTNUM = " +
    accountnum;
stmt.executeUpdate(sql);
conn.commit();


Det vigtige er øverste og nederste sætning.
Den øverste sikre at dine queries IKKE bliver udført før du siger conn.commit(); til basen

Hvis en eller flere queries går galt blvier ingen af dem gemt i basen.
Altså du har foretaget en transaktion.

Men læs hele artiklen, den hjalp mig meget da jeg ca. havde samme problem.
Avatar billede tien Nybegynder
28. juni 2002 - 13:46 #3
Jeg har ikke min connection i min administrations klasse!
I min abstract table klsse laver jeg connection til DB'en
hver gang jeg udfører en database funktion(insert, update...).
Avatar billede tien Nybegynder
28. juni 2002 - 13:47 #4
Kan jeg bruge TransactionManager?
Avatar billede disky Nybegynder
28. juni 2002 - 13:49 #5
du siger du har metoder til håndtering af insert, delete osv i din abstract klasse.
det er inde i disse metoder du skal slå autoCommit fra, og sende en commit efter du har sendt dine queries.

En transactionManager kan sikkert også bruges, jeg gjorde ovenstående.
Avatar billede tien Nybegynder
28. juni 2002 - 13:52 #6
Jeg kan ikke slå autoCommit fra i min abstract klasse, da den kun håndtere
en insert for en tabel. Jeg skal inserte i 2 forskellige tabeller.
Avatar billede tien Nybegynder
28. juni 2002 - 15:03 #7
disky> ved du hvordan man laver det en TransactionManager?
Avatar billede soelvpil Nybegynder
28. juni 2002 - 17:40 #8
Du kan bruge en TransactionManager, men har du en til rådighed? Det har du sandsynligvis kun, hvis du bruger en fuld applikationsserver.

Jeg vil i stedet foreslå følgende løsning:

Din abstrakte klasse har garanteret en getConnection-metode.

Du har garanteret også en metode:

public void insert(blabla) {
  Connection con = getConnection();
  // blabla indsæt ny række
  con.close();
}

lav en ny metode

public void insert(blabla, Connection con) {
  // blabla indsæt ny række
}

og lav den gamle metode om til

public void insert(blabla) {
  Connection con = getConnection();
  insert(blabla, con);
  con.close();
}

I den normale situation  hvor du kun gemmer en tabel, bruger du bare den gamle metode. I den nye situation hvor du gemmer i to tabeller laver du i stedet noget i retningen af

Connection con = DBHandler.getConnection();
con.setAutoCommit(false);
DBHandler.insert(blabla1, con);
DBHandler.insert(blabla2, con);
con.commit();
con.close();

Håber det kan give dig ideen, selvom koden er lidt skitseagtig!
Avatar billede tien Nybegynder
01. juli 2002 - 07:51 #9
soelvpil> Jeg tror du har fat i den "lange ende". Det er lige det jeg har brug for!! Jeg prøver det lige. (Hvorfor har jeg dog ikke tænkt på det...:-) )
I øvrigt bruger jeg IBM WebSphere Application Server...TransactionManageren
kunne være en idé, men hvilken måde giver den beste performance?
Avatar billede disky Nybegynder
01. juli 2002 - 09:16 #10
okay, nu brokker jeg mig sgu.

Jeg poster noget kode, og linker til en særdeles god artikel om emnet.
Så kommer soelvpil, poster lidt kode der, og han får point.

Som jeg skrev til at starte med så er .setAutoCommit(false) og .commit() de vigtige ting, hvilket også kan ses i soelvpil's kode.

Men hvorfor pokker får han så alle point ?

Synes du det er fair point fordeling, jeg gør bestemt ikke.
Avatar billede soelvpil Nybegynder
01. juli 2002 - 09:41 #11
disky: Nej, du har nok ret.
Du kom med hovedideen (commit o.s.v), men din implementation kunne ikke bruges i det konkrete tilfælde.

Jeg kom med en impl, der fulgte op på ideen, og virker i det konkrete tilfælde.

Vil en 50-50 -deling ikke være rimelig?

Jeg poster lige et dummy-spørgsmål.
Avatar billede tien Nybegynder
01. juli 2002 - 09:47 #12
disky> soelvpil gav mig "SVARET" og det virker!!!
Er det ikke meningen at pointene gives til den man synes har svaret bedst
på ens spørgsmål?
Men du skal på trods have tak for dine indslag!
Avatar billede tien Nybegynder
01. juli 2002 - 09:49 #13
Det glæder mig at I kan dele!!!
I skal begge have mange TAK!
Avatar billede disky Nybegynder
01. juli 2002 - 10:02 #14
soelvpil:

Mit eksemple kunne sagtens bruges, hvis tien roder med abstracte klasser som han siger der er funktionalitet i, kunen mit eksempel sagtens bruges.

jeg mente at ud fra han rodede med dem, kunne han ev.t også tænke lidt selv.

tien:
Ud fra det du selv siger er det eneste soelvpil, kommer med er:
Connection con = DBHandler.getConnection();
con.setAutoCommit(false);
DBHandler.insert(blabla1, con);
DBHandler.insert(blabla2, con);
con.commit();
con.close();


som sjovt nok er temmeligt mangen til min posting #2

Man giver normalt point til det/de svar som hjælper en
Avatar billede tien Nybegynder
01. juli 2002 - 10:14 #15
OK disky...jeg skal huske det med pointene til næste gang!

Men det jeg ledte efter, som soelvpil kom med, var idéen med at lave en ny
insert som havde conn som parameter... m.v.

Fik du ikke 50 point af soelvpil?
Avatar billede disky Nybegynder
01. juli 2002 - 10:26 #16
tien

jeg jeg har fået af ham.

Tien, hvis det var det du ledte efter hvorfor spurgte du som om hvordan du sikrede transactioner ? :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester