Databasekonsistens er også en av de viktige indikatorene for å måle DBMS-ytelse. For øyeblikket bruker de fleste kommersielle databaser (DB2, SQL Server) Two-Phase Locking (2PL)-protokollen for samtidighetskontroll, som sikrer serialisering av samtidig transaksjonsutførelse. Men 2PL må låse all data før den kan lese eller skrive til den. I blokkeringskompatibilitetsmatrisen er S-låser (Share Locks) og X-låser (eksklusive låser) inkompatible, så når transaksjon 1 utfører en leseoperasjon på data A (pluss en S-lås), og transaksjon 2 ønsker å skrive til dataene (legge til en X-lås), må transaksjon 2 vente til transaksjon 1 frigjør S-låsen på data A før den går videre. Multi-Version Concurrency Control (MVCC) løser dette problemet godt. I et flerversjonssystem genererer hver skrivedata en ny versjon, og leseoperasjonen kan lese den riktige versjonen etter behov, slik at lese- og skriveoperasjonene ikke blokkerer hverandre. MVCC øker samtidighet, men det medfører også lagringsoverhead ved å vedlikeholde flere versjoner.
Microsoft SQL Server-databasemotoren introduserer en ny implementering av det eksisterende transaksjonsisolasjonsnivået – committed reads, som gir snapshots på setningsnivå ved bruk av radversjonering. SQL Server-databasemotoren introduserer også et nytt nivå av transaksjonsisolasjon – snapshots for å gi transaksjonsnivå-snapshots som også bruker radversjonering.
Å sette READ_COMMITTED_SNAPSHOT database-alternativet til ON aktiverer dedikert leseisolasjon ved hjelp av radversjonering. Å sette ALLOW_SNAPSHOT_ISOLATION database-alternativet til PÅ aktiverer snapshot-isolasjon. Når et av alternativene er aktivert for databasen, opprettholder databasemotoren versjonen av hver rad som endres. Hver gang en transaksjon endrer en rad, kopieres bildet av raden før endringen til en side i versjonsbutikken. En versjonslagring er en samling datasider i tempdb. Hvis det finnes flere transaksjonsmodifikasjonslinjer, vil flere versjoner av den linjen være koblet sammen i en versjonskjede. En leseoperasjon ved bruk av radversjonering vil hente den siste versjonen av hver rad som ble committet ved transaksjons- eller setningsstart.
Applikasjoner skrevet for SQL Server 2008 eller nye til SQL Server implementerer isolasjon av lese-commits ved å bruke radversjonering ved å spesifisere transaksjonsisolasjonsnivået for lese-commits når READ_COMMITTED_SNAPSHOT-databasealternativet er PÅ. Alle lesninger vil se på radversjonen som ble gjort da uttalelsen startet. Dette vil gi et statement-nivå øyeblikksbilde av dataene.
Applikasjoner skrevet for SQL Server vil implementere snapshot-isolasjon ved å spesifisere snapshot-transaksjonsisolasjonsnivået når ALLOW_SNAPSHOT_ISOLATION-databasealternativet er PÅ. Alle lesninger i en snapshot-transaksjon vil se på versjonen av raden som ble committet da transaksjonen startet. Dette vil gi et transaksjonsnivå-øyeblikksbilde av dataene.
For transaksjoner som bruker radbaserte isolasjonsnivåer, ber ikke reads om delte låser på dataene. Dette betyr at lesere som bruker radversjonering ikke hindrer andre lesere eller forfattere i å få tilgang til de samme dataene. På samme måte står ikke forfatteren i veien for leseren. Men forfatterne kommer i veien for hverandre (selv når de kjører på et nivå av isolasjon basert på radversjonering). To skriveoperasjoner kan ikke endre de samme dataene samtidig.
Snapshot Isolation-funksjonen utvider låserammeverket i SQL Server 2008 ved å gjøre det mulig for applikasjoner å se verdier før eventuelle dataendringer skjer. Dette forhindrer at applikasjonen blir låst, samtidig som den leverer virkelig innsendte data. SQL Server 2008s Read Committed Snapshot krever at en databaseadministrator aktiveres, noe som gjør det mulig å lese data via skrivebeskyttede transaksjoner. Så SIs samtidige kontroll over skrivebeskyttede transaksjoner er veldig god, men det er uklart om dette gjelder for oppdateringstransaksjoner. Det er mer ugunstig for langvarige oppdateringstransaksjoner å konkurrere med kortsiktige høynivåtransaksjoner. Hvis en transaksjon på tvers av databaser forsøker å bruke Snapshot Isolation (SI)-standarden, i stedet for at alle databaser er satt, mislykkes transaksjonen. Dette skaper utvilsomt visse hindringer for skalerbarhet. Det virker som Microsoft fortsatt har en lang vei å gå for å oppnå sin egen SI som er sterkere enn SQL 92-spesifikasjonen.
Før noen endring, lag en kopi av forrige versjon, og alle påfølgende leseoperasjoner vil lese den kopierte versjonen, og endringen vil skape en ny versjon. På denne måten,Lese- og skriveoperasjoner blokkerer ikke hverandre. Fordelen med å bruke denne linjeversjoneringsmekanismen er at samtidigheten til programmet er relativt høy, men ulempen er at selv om brukeren ikke leser skitne data, kan det være en dataverdi som endres og er i ferd med å utløpe. Hvis du endrer dataene basert på denne utløpte verdien, vil det føre til en logisk feil。
SQL-kommandoer:
Referanselenker:
Innloggingen med hyperkoblingen er synlig.
Innloggingen med hyperkoblingen er synlig.
Innloggingen med hyperkoblingen er synlig.
Innloggingen med hyperkoblingen er synlig.
Innloggingen med hyperkoblingen er synlig.
Innloggingen med hyperkoblingen er synlig.
|