Avatar billede lone_a_p Praktikant
17. maj 2002 - 08:03 Der er 23 kommentarer og
1 løsning

Transaktioner

Jeg har hørt, at man ikke kan lave transaktioner i MySQL. Men man skulle kunne lave dem på en lidt alternativ måde.

Er der nogen, som kender til, hvordan man laver 'transaktioner' med MySQL?

Med Venlig Hilsen
Lone
Avatar billede ztyxx Nybegynder
17. maj 2002 - 08:07 #1
prøv at uddybe lidt nærmere hvad det er du vil :-)
Avatar billede hansk Nybegynder
17. maj 2002 - 08:37 #2
Transaktioner kan du lave vha ADO.

eks:

Dim Rs as Recordset
Dim Source As String, Connect As String

Rs.Open Source, Connect

Rs.MoveFirst
Do Until Rs.EOF
    Do things here
    Rs.MoveNext
Loop

MsgBox Rs.RecordCount
Rs.Close
Set Rs = Nothing
Avatar billede lone_a_p Praktikant
17. maj 2002 - 08:38 #3
Hvis vil have læst ind i to forskellige tabeller, og der kun bliver læst ind i den ene, er databasen jo ikke intakt. Så der skal være et eller andet der "undo'er" den første indlæsning, hvis den anden går galt.
Avatar billede hansk Nybegynder
17. maj 2002 - 08:40 #4
Det er en facilitet som hedder Commit. Ofte anvender man AutoCommit hvilket betyder at transaktioner automatisk bliver committed (endeligt opdateret)
Hvis ikke man anvender autocommit, skal man selv sørge for at committe sin transaktion.
Avatar billede lone_a_p Praktikant
17. maj 2002 - 08:47 #5
Bliver de første indlæsninger så slettet med commit, hvis nogle efterfølgende ikke gennemføres??
Avatar billede hansk Nybegynder
17. maj 2002 - 08:50 #6
Nej,
Man udfører alle de indlæsninger man vil, og når det hele er gået godt committer man sin transaktion.
Hvis det ikke er gået godt bliver de oprindelige data restored.
Avatar billede lone_a_p Praktikant
17. maj 2002 - 08:56 #7
Men jeg har ikke brugt commit indtil nu. Alt er dog læst ind??? - har den så brugt autocommit, eller ????. Hvis jeg giver dig noget kode, kan du så sige, hvor jeg skal indsætte commit?
Avatar billede hansk Nybegynder
17. maj 2002 - 09:17 #8
Det er ikke alle databaser som supporter commit. Dvs hvis en db ikke supporter commit vil den opdatere så langt som den nu kan, og hvis det går galt sidder man i værste fald med en db som man selv må rede ud.

Der findes et par metoder som hedder UpdateBatch og CancelBatch. Disse bruges i forbindelse med et loop som ovenfor, hvor du eks kan spørge brugeren om han nu er sikker på at han vil opdatere.
Disse skal bruges i forbindelse med LockType property før du åbner dit recordset.

Jeg ved dog ikke om MySql supporter disse metoder, men det gør det vel når du har hørt det.

Her er et par properties som skal sættes før Rs bliver åbnet: (VB)
rs.CursorType = adOpenKeyset
rs.LockType = adLockBatchOptimistic
Avatar billede lone_a_p Praktikant
17. maj 2002 - 09:24 #9
Nej, jeg aner ærligt talt ikke, hvad du snakker om ovenfor, men på uddannelsen, har vi også haft om InterBase og dér går det fint med transaktioner. Jeg tror jeg skal en ret besværlig vej, og lave nogle alternative 'transaktioner' i MySQL, men det ved jeg ikke engang, hvordan jeg gør??
Det er noget rigtig shit!
Avatar billede hansk Nybegynder
17. maj 2002 - 09:30 #10
så så, så er det vel heller ikke værre.
Vis noget af din kode, så skal jeg se om jeg kan hjælpe.
Avatar billede lone_a_p Praktikant
17. maj 2002 - 09:40 #11
Hej hansk!
Her er noget af koden. Hvis der sker en fejl undervejs (feks der ikke bliver deletet), skal det som er sket ovenfor 'gøres ugjort'.
Håber du kan hjælpe.


$db = mysql_connect("localhost", "root");
mysql_select_db("madital",$db);

//indsætter kropsvægten i databasen
$sql5 = "DELETE FROM vaegtforloeb WHERE brugerid = '$brugerid' AND dato = '$dato1'";
$result5 = mysql_query($sql5);

if ($kropsvaegt != "")
{
$sql4 = "INSERT INTO vaegtforloeb (brugerid, dato, vaegt) VALUES ('$brugerid', '$dato1', '$kropsvaegt')";
$result4 = mysql_query($sql4);
}


//indsætter de basisvarer og opskrifter i databasen som brugeren har indtastet
$sql3 = "DELETE FROM har_indtaget WHERE brugerid = '$brugerid' AND dato = '$dato1'";
$result3 = mysql_query($sql3);
Avatar billede rzj Nybegynder
17. maj 2002 - 10:01 #12
Det du snakker om lone_a_p handler ikke så meget om transaktioner som om det der hedder samtidighed (Concurrency). mySQL understøtter ikke Commit funktionen, men den har et tabel låsningssystem. Man kan altså låse en tabel når man læser og/eller skriver til tabellen og så låse op bagefter. Dette gør man typisk for hvis man opdatere en tabel - eksempelvis en opskriftssamling. Det nytter jo ikke at to mennekser sidder og opdatere den samme opskrift, hvis det den ene sidder og retter i slet ikke er det rigtige fordi den første allerede har lavet en UPDATE i tabellen.
Når man låser tabeller kan der opstå det der hedder DEAD LOCKS. Det er simpelthen to processer der venter på at hver deres ressourcer bliver frigivet - de står altså og venter på hinandens låse. En deadlosk er ikke sjov, men mySQL klarer problemet ved ALTID at tage låse i en bestemt (af mySQL bestemt) rækkefølge.
Så det du kal gøre for at få Transaktionssikkerhed (undgå Concurrency-problemer) er at lave nogle låse:
Dette kan du gøre sådan her:
LOCK TABLES litt_org WRITE
-->Udfør dine mySQL UPDATES, SELECTS og andet
UNLOCK TABLES

osv.
for mere om mySQL og Concurrency se: http://www.it-c.dk/courses/INP/F2002/SesAutCon-intro/www/p10.php
Avatar billede lone_a_p Praktikant
17. maj 2002 - 10:08 #13
Men hvad så hvis noget går galt undervejs, hvis eksempelvis opskriftens titel bliver læst ind i én tabel og indholdet dernæst IKKE bliver læst ind i den anden ???

Så er databasen jo ikke intakt???
Avatar billede hansk Nybegynder
17. maj 2002 - 10:13 #14
Følgende er en link som beskriver hvordan commit bruges i mysql:

http://www.mysql.com/doc/C/O/COMMIT.html

Prøv det og se hvordan det går.
Avatar billede rzj Nybegynder
17. maj 2002 - 10:15 #15
mySQL understøtter atomare operationer, hvilket betyder at alle handlinger udføres atomart - særskilt. Har du implementeret de rigtige låse osv. så burde det ikke være noget problem. En INSERT bliver eksempelvis ikke udført halvt. Enten går ALT godt eller også går det slet IKKE osv. Læs mere her: http://www.mysql.com/doc/A/N/ANSI_diff_Transactions.html
Avatar billede lundsfryd Nybegynder
17. maj 2002 - 22:26 #16
Hvilken version af MySQL bruger du?
Avatar billede lone_a_p Praktikant
18. maj 2002 - 10:57 #17
Jeg bruger version 3.22.32, og kan desværre ikke opdatere den fordi jeg får webstedet hostet andetsteds ... tror da ikke at jeg kan opdatere versionen så - jeg må indrømme, at jeg ikke har så meget forstand på det.

Jeg har i løbet af i går fundet frem til, at der er noget, som hedder InnoDB, som kan lægges bagved MySql. Dér kan man vistnok arbejde med transaktioner. Du må endelig rette mig, hvis jeg har misforstået noget.

Men har jeg ikke ret i, at jeg bliver nødt til at vente med transaktionsstyring, indtil versionen bliver opdateret?
Avatar billede lone_a_p Praktikant
18. maj 2002 - 11:00 #18
Man kan i øvrigt læse om InnoDB på adressen:

http://www.mysql.com/doc/I/n/InnoDB_overview.html

, som forklarer tingene så de er til at forstå ...
Avatar billede lundsfryd Nybegynder
18. maj 2002 - 17:12 #19
Når jeg spørger til versionen, er det fordi (som du måske ved), at MySQL 4 understøtter transaktioner.

InnoDB understøttes desværre sandsynligvis ikke i din hosts version, da den så vidt jeg ved normalt "aktivt" skal kompileres med under installationen.
Avatar billede lone_a_p Praktikant
19. maj 2002 - 10:09 #20
Er det ikke fordi InnoDB automatisk er implementeret i version 4.0? Jeg har søgt en masse efter det på nettet, men kan ikke rigtig finde noget konkret svar.

Jeg skriver i øjeblikket hovedopgave og vil MEGET GERNE høre noget mere om problemstillingen.
Avatar billede lundsfryd Nybegynder
19. maj 2002 - 13:53 #21
Uden at være 100% sikker mener jeg, at det rent faktisk er på MyISAM-tabellerne, at version 4 understøtter transaktioner.
Avatar billede lundsfryd Nybegynder
19. maj 2002 - 13:54 #22
Ved nærmere eftertanke: Jeg tror, at du har ret :)

Men det hjælper selvfølgelig ikke så meget, hvis ingen af delene er installeret. I så fald ville jeg kigge nærmere på det, som rzj foreslår.
Avatar billede lone_a_p Praktikant
19. maj 2002 - 17:18 #23
Ja, jeg har sat det med LOCK og UNLOCK i koderne.

Det er egentlig også bare det, at vi har haft om transaktioner i undervisningen i forbindelse med InterBase, og derfor skal der tages stilling til problemet.

Jeg tror jeg har fået den nødvendige viden.

Tak for hjælpen.
Avatar billede lone_a_p Praktikant
10. december 2002 - 13:41 #24
final
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
Computerworld tilbyder specialiserede kurser i database-management

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