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.
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.
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.
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?
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
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!
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.
//indsætter kropsvægten i databasen $sql5 = "DELETE FROM vaegtforloeb WHERE brugerid = '$brugerid' AND dato = '$dato1'"; $result5 = mysql_query($sql5);
//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);
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
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 ???
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
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?
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.
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.
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.