Transaksjoner og flerbrukerproblematikk. Transaksjoner

Like dokumenter
Transaksjoner og flerbrukerproblematikk. Transaksjoner

Transaksjoner. transaksjon. når starter/slutter 1 trans.?

Isolasjon i postgres og mysql

1. SQL datadefinisjon og manipulering

DBMS Database Management System (repetisjon) Programmeringsgrensesnitt. Serialiserbarhet

Videregående programmering 6

Datamodellering og databaser SQL, del 2

Øving 5: Transaksjonshåndtering, logging og normalisering

Datamodellering og databaser SQL, del 2

Hva har vi gjort? SQL og Databasedesign

Datamodellering og databaser SQL, del 2

Tilkobling og Triggere

Klasser skal lages slik at de i minst mulig grad er avhengig av at klienten gjør bestemte ting STOL ALDRI PÅ KLIENTEN!

INF3100 V2018 Obligatorisk oppgave nr. 2

Samtidighetsfenomener og anomalier i eksekveringsplaner (kursorisk) INF3100 Ellen Munthe-Kaas 1

Hva er Derby og Java DB? Denne forelesningen. Java Database Connectivity (JDBC) Hva er Derby og Java DB?

Metaspråket for å beskrive grammatikk

Å programmere databasetjeneren JavaDB. Programkoden ligger i databasen

Å bruke Java API-et til å sortere tabeller/arraylister der elementene er (referanser til) objekter

SQL: Systemaspekter. Evgenij Thorstensen V18. Evgenij Thorstensen SQL: Systemaspekter V18 1 / 21

DBS20 - Introduksjon til transaksjonsprosessering og teori

HØGSKOLEN I SØR-TRØNDELAG

Java Database Connectivity (JDBC) Norvald H. Ryeng

J2EE. CMP Entity Beans, Transaksjoner, JSP

Transaksjonshåndtering. Skalerbarhet.

Databaser: Relasjonsmodellen, del I

Introduksjon til fagfeltet

Samtidighetsfenomener og anomalier i eksekveringsplaner. INF Ellen Munthe-Kaas 1

DBS22 Databasegjenopprettingsteknikker

Sikkerhet og tilgangskontroll i RDBMS-er

HØGSKOLEN I SØR-TRØNDELAG

Objektorientering i ER-modeller EER-modeller Enhanced Entity Relationship Models

SQL 3: Opprette tabeller, datainnsetting og utsnitt

Løsningsskisse til Eksamensoppgave i TDT4145 Datamodellering og databasesystemer

Eksamen i Internetteknologi Fagkode: ITE1526

Applikasjonsutvikling med databaser

Integritetsregler i SQL. Primærnøkler

Utvikling fra kjernen og ut

Integritetsregler i SQL

HØGSKOLEN I SØR-TRØNDELAG

Database security. Kapittel 14 Building Secure Software. Inf329, Høst 2005 Isabel Maldonado

JDBC. Java DataBase Connectivity SQL i Java Læreboken: 8.5, s Forelesning i TDT4145, 9. mars 2004 Av Gisle Grimen

INF1300 Introduksjon til databaser

Systemaspekter ved SQL

Systemaspekter ved SQL

ORDBMS og OODBMS i praksis

SQL, del 1 - select. Hva er SQL?

Databaser kort intro. Tom Heine Nätt

Repetisjonsforelesning, SQL og utover

Høgskolen i Telemark EKSAMEN 6102 DATABASER Tid: Hjelpemidler: Vedlegg: Eksempeldata til oppgave 1

INF1300 Introduksjon til databaser

8. JDBC-programmering med tilrettelegging for webapplikasjoner

Miniverden og ER- modell

Løsningsforslag Eksamen i TDT4190 Distribuerte systemer

Labquality/NKK ELEKTRONISK RESULTATSKJEMA VIA INTERNET. Åpning av skjemaet. Logg inn på Participant services. Velg resultatskjemaet

Prosedyrer. Lars Vidar Magnusson. October 26, Lars Vidar Magnusson () Forelesning i DAS October 26, / 19

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

Oppgaver Oppgave a: Sett opp mulige relasjoner

Minikompendium TDT4145 databasemod og dbsys

Bruke SQL fra Python. Med Psycopg2

Utvikling fra kjernen og ut

Andre sett obligatoriske oppgaver i INF3100 V2013

Utvikling fra kjernen og ut

UNIVERSITETET I OSLO SQL. Structured Query Language. (forts.) Institutt for Informatikk. INF Ragnar Normann 1

Arne Maus, Ifi. delvis lån av gamle foiler

Transaksjonsmodell. Samtidighet (1) ACID-transaksjoner. Samtidighet (2) Systemkræsj (1) Kapittel 17, Coping With System Failure

HVA ER XML? extensible Markup Language En standardisert måte å strukturere ulike typer data Åpent format Enkelt:

Integritetsregler i SQL

HØGSKOLEN I SØR-TRØNDELAG

Repetisjon av transaksjonshåndtering og samtidighetskontroll. Lana Vu

Romlig datamanipulering

MySQL. Historikk. Nedlasting og installasjon

Satsvise, interaktive, sanntids/innbakte systemer. Arne Maus, Ifi. Oppdeling av både program og data på flere maskiner

Repetisjon: Normalformer og SQL

Oppgave 1 ER- og relasjonsmodell 10 %

Utvikling fra kjernen og ut

Oppgave 1 Datamodellering 25 %

Eksamensoppgave i TDT4145 Datamodellering og databasesystemer

Effektiv Systemadministrasjon

Databaser & objektorientering.

Kapittel og 5. september Institutt for geofag Universitetet i Oslo. GEO En Introduksjon til MatLab. Kapittel 4.

HØGSKOLEN I SØR-TRØNDELAG

Løsningsskisse til eksamensoppgave i TDT4145 Datamodellering og databasesystemer

Utvikling fra kjernen og ut

10. ASP og SQL Innledning Recordset-objektet. Innhold. Referanse til læreboka Kapittel Se detaljer nedenfor.

D: Ingen trykte eller håndskrevne hjelpemiddel tillatt. Bestemt, enkel kalkulator tillatt.

AJOURHOLD AV AR5 I QMS

Transaksjonshåndtering Del 3

INF1300 SQL Structured Query Language del 1. Stoff som blir/ble forelest i oktober 2013

UNIVERSITETET I OSLO SQL. Structured Query Language. (forts.) Institutt for Informatikk. INF Ellen Munthe-Kaas 1

Operativsystemer og nettverk Løsningsforslag til eksamen Oppgave 1. a) Linux-kommando: java Beregn & b) Shellprogram:

Løsningsskisse til eksamensoppgave i TDT4145 Datamodellering og databasesystemer

HØGSKOLEN I SØR-TRØNDELAG

SQL: Integritetsregler, triggere og views

Transaksjonshåndtering Del 3

Databasesystemer, oversikt

Eksamen i Internetteknologi Fagkode: IVA1379

Løsningsforslag matoppskrifter modellering

Oppgave 1 (Opprett en database og en tabell)

Transkript:

LC238D http://www.aitel.hist.no/fag/_dmdb/ Transaksjoner og flerbrukerproblematikk Transaksjoner side 2-4 Låseteknikker side 5 Isolasjonsnivåer side 6-7 Flerbrukerproblemer i fbm utførelse av transaksjoner side 8-12 Gjenoppretting av en database side 13 Læreboka, kapittel 8.2, side 248-265 Forelesning 12, uke 45 Transaksjoner En transaksjon er en logisk enhet med arbeid (ett sett med databaseoperasjoner) som må utføres i sin helhet. Eksempler: overføre penger fra en konto til en annen eksempler JSF-forelesning 9: registrere en boktittel og 1.eksemplar av tittelen (insert + insert) registrere nytt eksemplar med nr 1 større enn hittil brukte (select + insert) Dersom alt gikk bra, bekreftes transaksjonen (commit), hvis ikke rulles den tilbake (rollback) Egenskaper ved transaksjoner (ACID) En transaksjon er atomisk. Enten utføres hele transaksjonen, eller ingenting. Transaksjonen må føre databasen fra en stabil tilstand til en annen stabil tilstand. Datakonsistens må sikres. Dataene som berøres av en transaksjon må isoleres, slik at ikke andre transaksjoner kan arbeide med de samme dataene. Forskjellige nivåer av isolering. Etter at en transaksjon er avsluttet, skal endringene lagres permanent og bli synlige for andre brukere. ( durability ). Samtidige transaksjoner må utføres som om de ble utført i serie, dvs. etter hverandre. Det betyr at transaksjonene av og til vil måtte vente på hverandre Transaksjoner er enheten både ved utførelse og ved gjenoppretting (recovery). Forelesning 12, side 2 1

Transaksjoner og AUTOCOMMIT AUTOCOMMIT er en tilstand som kan slås av og på AUTOCOMMIT er en egenskap som den enkelte klient har i forhold til sin databasetilknytning AUTOCOMMIT på betyr at oppdateringer av databasen (INSERT/DELETE/UPDATE) skjer umiddelbart etter hver enkelt SQL-setning. Ikke mulig å angre ved å bruke ROLLBACK JDBC AUTOCOMMIIT på er standard try { forbindelse.setautocommit(false); // slå av autocommit før transaksjoner... mer enn én UPDATE/INSERT/DELETE-setning) utføres... forbindelse.commit() } catch (SQLException e) { rulltilbake(); // vi angrer det som måtte være gjort (forbindelse.rollback())... skriv eventuelle meldinger... } finally { // utføres alltid (unntatt hvis System.exit() påtreffes før)... lukk databaseressurser... slåpåautocommit(); // forbindelse.setautocommit(true); } Stol ikke på at det ene (commit) eller det andre (rollback) skjer dersom man ikke avslutter på ryddig måte JavaDB-klienten ij AUTOCOMMIT på er standard Oracle-klientene SQL*Plus og SQLpal AUTOCOMMIT av er standard Kommando: set autocommit on/off; Forelesning 12, side 3 Transaksjoners start og slutt Vanlig at hver enkelt SQL-setning utgjør en transaksjon. Det vil for de fleste DBMS si at bryteren AUTOCOMMIT er på Hvis vi vil at en transaksjon skal bestå av flere setninger, må vi definere start og slutt av transaksjonen Transaksjonen starter vanligvis (Oracle, JavaDB m.fl.) sørg for at AUTOCOMMIT er slått av kjør deretter setningene som utgjør transaksjonen noen DBMS har egen syntaks for dette, f.eks. BEGIN TRANSACTION Transaksjonen slutter ved første COMMIT eller ROLLBACK husk å sette tilbake AUTOCOMMIT Forelesning 12, side 4 2

Låseteknikker Låsing begrenser andre transaksjoners tilgang til dataene. Granulariteten, dvs hvor stor del av databasen som låses: Verdi, rad, tabell eller hele databasen kalles objekt nedenfor Låsing på radnivå er standard i Oracle og JavaDB. To typer lås Delt lås (shared lock) - leselås: Brukes kun ved lesing og godtar at flere transaksjoner leser de samme dataene. Flere transaksjoner kan ha delt lås på de samme objektene. Dersom en transaksjon holder delt lås på et objekt, kan andre transaksjoner lese, men ikke endre dataene. Eksklusiv lås (exclusive lock) skrivelås: Kan settes av kun én transaksjon av gangen. Forutsetter at det ikke er andre låser på objektet, heller ikke delte låser. Andre transaksjoner har ikke tilgang til dataene i det hele tatt. To-fase-låsing Garanterer korrekt utførelse av transaksjoner Fase 1, utvidelsesfasen: Låser settes etter hvert som de trengs i transaksjonen. Fase 2, avviklingsfasen (COMMIT/ROLLBACK): Alle låsene åpnes på en gang. Vranglås kan oppstå hvis to transaksjoner blir stående å vente på hverandre. Løses ved timeout. En av transaksjonene ofres (tilbakerulles) at alle låser settes ved begynnelsen av transaksjonen. Ueffektivt. avanserte løsninger prøver å oppdage mulige vranglåser på forhånd Forelesning 12, side 5 Ulike isolasjonsnivåer Jmf prinsippet om Isolasjon: Dataene som berøres av en transaksjon må isoleres, slik at ikke andre transaksjoner kan arbeide med de samme dataene. Fullstendig isolasjon (Isolasjonsnivå SERIALIZABLE) SELECT setter delt lås UPDATE setter eksklusiv lås I praksis er dette et for strengt krav Ulike nivåer defineres ut fra i hvor stor grad de bryter kravet til fullstendig isolasjon (SERIALIZABLE) Ikke-overgitte data ( Dirty Read ) Transaksjon B kan se data som transaksjon A har endret, men ikke bekreftet (committed). Det vil si at dataene kan bli rullet tilbake. ( dirty read ) Ikke-repeterende lesing av data B leser en verdi som A senere endrer. Hvis B leser verdien på nytt i samme transaksjon, men nå ser den endringen A foretok, har vi et eksempel på ikke-repeterende lesing Fantomlesing B leser et sett med rader begrenset av et WHERE-uttrykk A legger inn data som passer inn i intervallet gitt av WHERE-uttrykket B leser på nytt, men ser nå også de dataene A la inn (data som tidligere ikke fantes, fantomdata) Forelesning 12, side 6 3

Isolasjonsnivåer, forts. Nivå (ANSI SQL) Dirty read Nonrepeatable Read Phantom Read READ UNCOMMITTED tillatt tillatt tillatt READ COMMITTED ikke tillatt tillatt tillatt REPEATABLE READ ikke tillatt ikke tillatt tillatt SERIALIZABLE ikke tillatt ikke tillatt ikke tillatt En implementasjon av et isolasjonsnivå kan være strengere enn dette Vanlig isolasjonsnivå er READ COMMITTED. Det vil si at select aldri låser data. Data låses kun når insert, delete, update påtreffes. For å få til låsing med select, må du sette isolasjonsnivået til SERIALIZABLE. Forelesning 12, side 7 Isolasjonsnivåer og DBMS-støtte Vedlagte Java-program kan brukes til å finne ut hvilke nivåer et DBMS støtter. Oracle støtter READ COMMITTED (standard) og SERIALIZABLE. Java DB støtter alle nivåene, men READ COMMITTED er standard. http://db.apache.org/derby/docs/10.6/devguide/rdevconcepts8424.html Dersom du trenger å bruke et høyt isolasjonsnivå i en transaksjon, husk å sette tilbake til standard etter bruk. JDBC, interface java.sql.connection int gettransactionisolation() void settransactionisolation(int level) side 8 4

Flerbrukerproblemer som kan oppstå ved transaksjonsutføring Problemene kan klassifiseres i tre grupper Tapt oppdatering, dvs. at en oppdatering blir skrevet over av en annen oppdatering Ikke-bekreftede data, dvs. at en transaksjon får se data fra en annen transaksjon før disse er bekreftet Inkonsistent uthenting av data, dvs. at en transaksjon leser data som er delvis oppdatert av en annen transaksjon Som oftest løses problemene ved at dataene som oppdateres reserveres ( låses ) for den transaksjonen som først begynte å arbeide med dem. Forsøker i det lengste å unngå å sette isolasjonsnivå SERIALIZABLE Husk også å vurdere om optimistisk utførelse kan løse problemet Eksempel: JSF-forelesning 8: registrere nytt eksemplar med nr 1 større enn hittil brukte (select + insert) Select max() Insert into (maksnr + 1) Hvis sqlexception (primærnøkkelfeil), prøv på nytt et begrenset antall ganger Forelesning 12, side 9 Utprøving av flerbrukerproblematikken Testdata DROP TABLE konto; CREATE TABLE konto( kontonr INTEGER PRIMARY KEY, saldo INTEGER NOT NULL); INSERT INTO konto(kontonr, saldo) VALUES(1, 35); INSERT INTO konto(kontonr, saldo) VALUES(2, 120); INSERT INTO konto(kontonr, saldo) VALUES(3, 100); INSERT INTO konto(kontonr, saldo) VALUES(4, 35); INSERT INTO konto(kontonr, saldo) VALUES(5, 100); INSERT INTO konto(kontonr, saldo) VALUES(6, 30); Forelesning 12, side 10 5

Åpne to forekomster av en JavaDB-klient og prøv ut Kan ikke kjøre klientene i NetBeans, må bruke kommandobasert grensesnitt Oppsett av miljøvariabler, se http://javabok.no/installasjoner/javadb/javadbmedij.html Start databasetjeneren Enten i NetBeans Eller fra kommandolinjen med skriptet <JavaDB-home>\bin\startNetworkServer.bat I siste tilfelle bør du huske å stoppe tjeneren med kommandoen <JavaDBhome>\bin\stopNetworkServer.bat Åpne to kommandovinduer Start en databaseklient i hvert vindu med skriptet <JavaDB-home>\bin\ij.bat Syntaks JavaDB autocommit on/off; set isolation read committed; set isolation serializable; - se også neste side! commit; rollback; side 11 Java DB, navn på isolasjonsnivå Table 1. Mapping of JDBC transaction isolation levels to Derby isolation levels http://db.apache.org/derby/docs/10.5/devguide/ Isolation levels for JDBC Connection.TRANSACTION_READ_UNCOMMITTED (ANSI level 0) Connection.TRANSACTION_READ_COMMITTED (ANSI level 1) Isolation levels for SQL UR, DIRTY READ, READ UNCOMMITTED CS, CURSOR STABILITY, READ COMMITTED Connection.TRANSACTION_REPEATABLE_READ (ANSI level 2) setter delt lås på intervall omfattet av where-uttrykk i select-setning, men forhindrer ikke insert. (krever søk på index, ellers låses hele tabellen) Connection.TRANSACTION_SERIALIZABLE (ANSI level 3) setter delt lås på intervall omfattet av where-uttrykk i select-setning. (krever søk på index, ellers låses hele tabellen) RS RR, REPEATABLE READ, SERIALIZABLE side 12 6

Flerbrukerproblem A: Tapt oppdatering (Ingen låsing) Tid Transaksjon A Verdi som A ser Transaksjon B Verdi som B ser 1 select saldo from konto 35 2 select saldo from konto 35 3 tar ut 30 kr update konto set saldo = 5 5 4 tar ut 20 kr update konto set saldo = 15 15 5 commit 6 commit Merk at B tar beslutning om å endre saldo på feil grunnlag. Hvilke resultater kan vi få ved seriell utførelse av transaksjonene? A før B: -15 B før A: -15 Løser standard isolasjonsnivå (READ COMMITTED) problemene? Nei, svaret blir 15, og det er ikke riktig. Alternativer? Serializable. VRANGLÅS. DerbyDB stopper begge transaksjonene. Forelesning 12, side 13 Flerbrukerproblem B: Leser ikke-bekreftede data (Ingen låsing) Tid Transaksjon A Verdi som A ser Transaksjon B Verdi som B ser 1 select saldo from konto 2 setter inn 65 kr update konto set saldo = 100 35 100 3 select saldo from konto 100 ( dirty read ) 4 rollback 5 tar ut 50 kr update konto set saldo = 50 50 6 commit Merk at B tar beslutning om å endre kvantum på feil grunnlag. Resultater ved seriell utføring: Kun transaksjon B blir utført. Løser standard isolasjonsnivå (READ COMMITTED) problemene? Ja, B vil nå få se verdien 35. Setning 3 vil ikke bli utført før setning 4. B må vente til A er ferdig. Forelesning 12, side 14 7

Flerbrukerproblem C: Inkonsistent uthenting av data (Ingen låsing) Tid Transaksjon A Verdier som A ser Transaksjon B (overføring av penger fra en konto til en annen) 1 select sum(saldo) from konto; 420 2 update konto set saldo = saldo - 20 where kontonr = 3 3 select sum(saldo) from konto; 400 4 update konto set saldo = saldo + 20 where kontonr = 2 5 commit Resultater ved seriell utføring? Summen skal bli 420 uansett! Løser standard isolasjonsnivå (READ COMMITTED) problemene? Ettersom det kun er i B vi har oppdateringer, tenker vi ikke transaksjon i det hele tatt for A. Vi prøver standard isolasjonsnivå på B. Erfaringene med JavaDB er ikke entydige: B låser rad 2 så A må vente på å få utført pkt. 3. Etter commit (pkt.5) vises summen for A, men verdien som vises er feil (=400!). Dersom vi bytter om update-setningene 2 og 4, blir imidlertid summen lik 420 begge gangene. Hvorfor denne forskjellen? Problemet ble forelagt gjesteforeleserne våre, se neste side Forelesning 12, side 15 Flerbrukerproblem C: Hvorfor? Dag Wanvik, Oracle: Jeg tror problemet ligger i det faktum at når du endrer rekkefølge på 2 og 4 blir det riktig: I det første tilfellet, stopper tranaksjon A's scan opp på kontono=3, dvs. rad med kontonr 2 er allerede lest av scannet som gjør sum(saldo) i A. Når B slipper låsen på kontonr 3, blir den tilgjengelig for A, som da ser en totalsum som er 420-20, dvs 400. Å endre isolasjonsnivå på B har ingen hensikt, det gjelder leseren. Hvis A har isolasjonsnivå serializable skulle du ikke kunne se dette, men default er read committed. (Ved serializable vil A sette leselås på konto 2, og vi får deadlock, siden B aldri da får skrivelås på konto 2), og man unngår fenomenet. Så jeg tror dette er rett oppførsel. Else Lervik, oktober 2010 side 16 8

Flerbrukerproblem C: Løsning Videre kommunikasjon: Jeg: Konklusjonen er dermed at en select-setning som henter ut data fra mer enn en rad bør legges i en transaksjon med isolasjonsnivå SERIALIZABLE. Wanvik: Ja, iallefall hvis man bare ønsker å se resultatet av "hele" andre transaksjoner. Jeg: På denne måten er en sikret at radene får være i fred når prosessen pågår. Jeg husker forresten at jeg har vært borti dette tilfellet før, i Oracle løste vi problemet med noe som het SELECT FOR UPDATE... eller lignende. Wanvik: Ja, ved select for update settes en skrivelås. Java DB har forresten en mulighet til å sette isolasjonsnivå bare for utvalgte queries også hvis serializable er "strengt" (gir for dårlig concurrency) på mindre sensitive deler av transaksjonen): SELECT... WITH [{RR RS CS UR}] RR er "repeatable read" in IBM DB2 parlance, corresponding to ISO SQL serializable. Cf. http://db.apache.org/derby/docs/10.6/devguide/cdevconcepts30291.html Else Lervik, oktober 2010 side 17 Gjenoppretting av en database ( recovery ) Mekanismer for å gjenopprette en database etter feil periodiske sikkerhetskopier logg som inneholder endringer (dataverdi før og etter endring) siden forrige sikkerhetskopi, inkl transaksjoner som ikke er bekreftet sjekkpunkt = tidspunkt som viser når permanente endringer ble utført (databasebufrene skrives til disk) transaksjoner kan pågå på et sjekkpunkt Bruk av sikkerhetskopi + loggfil kan være tidkrevende nyeste sikkerhetskopi legges inn hele loggfilen kjøres bekreftede transaksjoner kjøres på nytt tilbakerullede transaksjoner glemmes transaksjoner under utførelse tilbakerulles, og kjøres eventuelt på nytt senere Bruk av loggfil pga uforutsette feil går tilbake til siste sjekkpunkt pass på at transaksjonen som forårsaket feilen ikke kjøres på nytt Forelesning 12, side 18 9