130 likes | 213 Views
Webprogrammering. SQL og databaser del 3. I dag. Databasetransaksjoner Søk Kodegjennomgang Oppgaveløsning. Databasetransaksjoner. For å sikre at flere sql’s blir skrevet til databasen konsistent (alle eller ingen rader) F.eks ved Innsetting i to forskjellige tabeller
E N D
Webprogrammering SQL og databaser del 3
I dag • Databasetransaksjoner • Søk • Kodegjennomgang • Oppgaveløsning
Databasetransaksjoner • For å sikre at flere sql’s blir skrevet til databasen konsistent (alle eller ingen rader) • F.eks ved • Innsetting i to forskjellige tabeller • Oppdatering av to forskjellige tabeller • Bruker MySql-i fortsatt • Må bruke spesiell databasemotor på alle tabellene (InnoDB)!
DB transaksjoner • Knytte seg til DB • Sette autocommit = false • Utføre de SQL’s som ønskes (f.eksinserts) • Sjekke om hver enkelt SQL gikk bra • Dersom alle SQL-setningene OK • Commit • Dersom feil • Rollback
Eksempel: Kunde-Bestilling • En kunde skal registreres i en tabell samtidig som en vare skal registreres i en annen • Dersom ikke kunden eller bestillingen kan registreres skal ingen av dem lagres Kunde Bestilling • IDKundeNavn • Adresse • … • IDBestilling • Varenavn • Pris • IDKunde
DB-tx uten feilhåndtering $db = new mysqli("localhost","root","","butikk"); $db->autocommit(false); $sql = "InsertInto kunde (Navn, Adresse) Values ('$navn','$adresse')"; $resultat = $db->query($sql); $id = $db->insert_id; $sql = "InsertInto bestilling (idKunde, Varenavn, Pris) Values ('$id','$vare',$pris)"; $resultat = $db->query($sql); $db->commit(); $db->close();
$db->autocommit(false); $sql = "InsertInto kunde (Navn, Adresse) Values ('$navn','$adresse')"; $resultat = $db->query($sql); $ok = true; if(!$resultat) { $ok = false; } else { if($db->affected_rows==0) { $ok=false; } $sql = "InsertInto bestilling (Varenavn, Pris) Values ('$vare',$pris)"; $resultat = $db->query($sql); if(!$resultat) { $ok = false; } else { if($db->affected_rows==0) { $ok=false; } } if($ok) { $db->commit(); echo "Innsetting OK"; } else { $db->rollback(); echo "Feil i innsettingen i databasen”; } DB-tx med feilhåndtering
Eksempel: Kunde-Bestilling • I eksemplet er det en relasjon! • Først lagres kunden. Så skal IDKunde(autonummer) lagres i bestillingen! Kunde Bestilling • IDKundeNavn • Adresse • … • IDBestilling • Varenavn • Pris • IDKunde
For å finne IDKunde til neste Insert $sql = "InsertInto kunde (Navn, Adresse) Values ('$navn','$adresse')"; $resultat = $db->query($sql); $ok = true; if(!$resultat) { $ok = false; } else { if($db->affected_rows==0) { $ok=false; } else { $id = $db->insert_id; // alt OK her! } } $sql = "InsertInto bestilling (IDKunde, Varenavn, Pris) Values ('$id','$vare',$pris)"; $resultat = $db->query($sql); ……. osv Kunde Bestilling • IDKundeNavn • Adresse • … • IDBestilling • Varenavn • Pris • IDKunde
Søk i databaser • Select * from ansatt where fornavn = ”Per”; • Select * from ansatt where fornavn = ”Per” and etternavn = ”Olsen”; • Rett frem søk • Bør vurdere om dere skal ha index for fornavn og etternavn for å gjøre slike søk mer effektive.
Søk med Like • Select * from ansatt where fornavn Like ”%Ole%”; • Da får vi treff for • Ole Petter • Ole • Nils Ole • Her bør en index brukes på fornavnskolonnen. • Worst case da: En full index-scan (ikke en tabell-scan)
Søk med Match Against Kolonne i ansatt • Fulltekstsøk er mulig med • Select * from ansatt where match (beskrivelse) against (”Prosjektleder Leder”). • Søker etter alle ordene i against listen (men ikke små ord som ”en”, ”og” el) • De ordene som går igjen i 50 % av radene lukes vekk • Ingen utsiling : (against (”Prosjektleder Leder” IN BOOLEAN MODE).
Søk med Match Against • Må bruke en FULLTEXT index på kolonnen(e) • Bruke text-blobs istedenfor varchar: • Kolonnetype • Text : maks 64 KB • MediumText : maks 16 MB • LongText : maks 4.2 GB • Bare for MyISAM (ikke InnoDB) • Da kan man ikke gjøre databasetransaksjoner