Tietokannan yhdenmukaisuus on myös yksi tärkeimmistä mittareista DBMS:n suorituskyvyn mittaamisessa. Tällä hetkellä useimmat kaupalliset tietokannat (DB2, SQL Server) käyttävät Two-Phase Locking (2PL) -protokollaa rinnakkaislukkojen hallintaan, mikä varmistaa samanaikaisen transaktion suorittamisen sarjallistamisen. Kuitenkin 2PL:n täytyy lukita kaikki tiedot ennen kuin se voi lukea tai kirjoittaa sille. Estoyhteensopivuusmatriisissa S-lukot (Share Locks) ja X-lukot (Exclusive Locks) ovat yhteensopimattomia, joten kun transaktio 1 suorittaa lukutoiminnon datalle A (plus S-lukko) ja transaktio 2 haluaa kirjoittaa dataan (lisätä X-lukon), transaktio 2 joutuu odottamaan, että transaktio 1 vapauttaa S-lukon datassa A ennen kuin etenee. Multi-Version Concurrency Control (MVCC) ratkaisee tämän ongelman hyvin. Moniversiojärjestelmässä jokainen kirjoitusdata tuottaa uuden version, ja lukutoiminto voi lukea sopivan version tarpeen mukaan, joten luku- ja kirjoitusoperaatiot eivät estä toisiaan. MVCC lisää samanaikaisuutta, mutta tuo myös mukanaan tallennuskuorman useiden versioiden ylläpidosta.
Microsoft SQL Server -tietokantamoottori esittelee uuden toteutuksen olemassa olevasta transaktioiden eristystasosta – sitoutuneista lukemistasoista, jotka tarjoavat lausetason snapshotit riviversioinnilla. SQL Server -tietokantamoottori tuo myös uuden tason transaktioiden eristyksessä – snapshotit, jotka tarjoavat transaktiotason snapshotteja, jotka käyttävät myös riviversiointia.
Asettamalla READ_COMMITTED_SNAPSHOT tietokantavaihtoehdon PÄÄLLE mahdollistaa sitoutuneen lukueristyksen riviversioinnilla. Asettamalla ALLOW_SNAPSHOT_ISOLATION tietokanta-asetuksen PÄÄLLE mahdollistaa snapshot-eristyksen. Kun kumpikin vaihtoehto on käytössä tietokannalle, tietokantamoottori ylläpitää kunkin rivin muokatun version. Aina kun transaktio muuttaa riveä, ennen muutosta oleva rivin kuva kopioidaan versiokaupan sivulle. Versiotallennus on kokoelma datasivuja tempdb:ssä. Jos transaktioiden muokkausrivejä on useita, kyseisen rivin useita versioita linkitetään versioketjuun. Lukutoiminto, jossa käytetään riviversiota, hakee viimeisen version jokaisesta rivistä, joka oli sitoutunut transaktion tai lauseen alkaessa.
SQL Server 2008:lle kirjoitetut tai uudet SQL Serverille tarkoitetut sovellukset toteuttavat lukukomittien eristämisen riviversioinnilla määrittämällä lukucommittien transaktion eristystaso, kun READ_COMMITTED_SNAPSHOT tietokantavaihtoehto on päällä. Kaikki lukemat katsovat rivin version, joka oli sitoutunut lauseen alkaessa. Tämä antaa lausetasoisen tilannekuvan datasta.
SQL Serverille kirjoitetut sovellukset toteuttavat snapshot-eristyksen määrittämällä snapshot-transaktion eristystason, kun ALLOW_SNAPSHOT_ISOLATION tietokantavaihtoehto on päällä. Kaikki snapshot-transaktion lukemat katsovat sitä versiota rivistä, joka oli sitoutunut tapahtuman alussa. Tämä tarjoaa transaktiotason tilannekuvan datasta.
Niissä transaktioissa, jotka käyttävät rivipohjaisia eristystasoja, lukemiset eivät pyydä jaettuja lukkoja datalle. Tämä tarkoittaa, että riviversioita käyttävät lukijat eivät estä muita lukijoita tai kirjoittajia pääsemästä samoihin tietoihin. Samoin kirjoittaja ei häiritse lukijaa. Kuitenkin kirjoittajat tulevat toistensa tielle (vaikka ne olisivat eristyksissä riviversioiden takia). Kaksi kirjoitusoperaatiota eivät voi muokata samaa dataa samanaikaisesti.
Snapshot Isolation -ominaisuus laajentaa SQL Server 2008:n lukituskehystä mahdollistamalla sovellusten arvojen tarkastelun ennen kuin datan muutoksia tapahtuu. Tämä estää sovelluksen lukitumisen, mutta silti antaa aidosti lähetetyt tiedot. SQL Server 2008:n Read Committed Snapshot vaatii tietokantaylläpitäjän aktivoinnin, jolloin data voidaan lukea vain luku -transaktioilla. SI:n samanaikainen hallinta vain luku -tapahtumissa on erittäin hyvä, mutta ei ole selvää, onko tämä tilanne päivitystapahtumissa. On epäedullisempaa pitkäkestoisten päivitystransaktioiden kilpaileminen lyhyen aikavälin korkean tason transaktioiden kanssa. Jos transaktio tietokantojen välillä yrittää käyttää Snapshot Isolation (SI) -standardia sen sijaan, että kaikki tietokannat asetettaisiin, transaktio epäonnistuu. Tämä luo epäilemättä tiettyjä esteitä skaalautuvuudelle. Vaikuttaa siltä, että Microsoftilla on vielä pitkä matka saavuttaakseen oman SI:n, joka on vahvempi kuin SQL 92 -määrittely.
Ennen muokkausta tehdään kopio edellisestä versiosta, ja kaikki myöhemmät lukutoiminnot lukevat kopioidun version, ja muokkaus luo uuden version. Näin,Luku- ja kirjoitustoiminnot eivät estä toisiaan. Tämän riviversiointimekanismin etuna on, että ohjelman samanaikaisuus on suhteellisen suuri, mutta haittapuolena on, että vaikka käyttäjä ei lue likaista dataa, kyseessä voi olla muokattava data-arvo, joka on vanhentumassa. Jos muokkaat dataa tämän vanhentuneen arvon perusteella, se aiheuttaa loogisen virheen。
SQL-komennot:
Viitelinkit:
Hyperlinkin kirjautuminen on näkyvissä.
Hyperlinkin kirjautuminen on näkyvissä.
Hyperlinkin kirjautuminen on näkyvissä.
Hyperlinkin kirjautuminen on näkyvissä.
Hyperlinkin kirjautuminen on näkyvissä.
Hyperlinkin kirjautuminen on näkyvissä.
|