Samanaikaisuuden kuvaaminen
Usean tietokantojen ydinominaisuus on samanaikaisuus. Concurrency käyttää lukitusta ja estoa, jotta tiedot pysyvät yhdenmukaisina sen kanssa, että monet käyttäjät päivittävät ja lukevat tietoja samanaikaisesti. Esimerkiksi toimituskustannusten vuoksi kaikkien tuotteiden hinnannousu on 5 dollaria. Valuuttakurssien vuoksi kaikkien tuotteiden hinnan lasku on% 3. Jos nämä päivitykset tehdään täsmälleen samanaikaisesti, lopullinen hinta on muuttuja ja virheitä on todennäköisesti paljon. Lukitusta käyttämällä voit varmistaa, että yksi päivitys on valmis ennen toisen käynnistymistä.
Samanaikaisuus tapahtuu tapahtumatasolla. Kirjoitustapahtuma voi estää muita tapahtumia päivittämästä ja jopa lukemasta samoja tietoja. Lukutapahtuma voi myös estää muita lukijoita tai jopa joitakin kirjoittajia. Siksi on tärkeää välttää tarpeettoman pitkiä tapahtumia tai tapahtumia, jotka kattavat liian paljon tietoja.
On monia erityisiä tapahtumien eristystasoja, joiden avulla voidaan määrittää, miten tietokantajärjestelmä käsittelee useita käyttäjiä. Tässä moduulissa tarkastelemme laajoja eristystason, optimistisen lukitsemisen ja aksenttisen lukitsemisen luokkia.
Huomautus
Tapahtumien lukitsemisen koko yksityiskohta samanaikaisuuden lisäksi liittyy enemmän suorituskykyyn eikä vain koodiin – vaikka hyvä koodi toimii paremmin. Katso lisätietoja sql Serverin tapahtumien lukitus- ja riviversio-oppaasta . Lisätietoja estämisestä on myös SQL Server Performance -dokumentaatiossa.
Optimistinen samanaikaisuus
Optimistisen lukituksen myötä oletuksena on, että päivityksiä on vähän. Tapahtuman alussa tallennetaan tietojen alkuperäinen tila. Ennen kuin tapahtuma on toteutettu, nykyistä tilaa verrataan alkuperäiseen tilaan. Jos osavaltiot ovat samat, tapahtuma suoritetaan. Jos osavaltiot ovat erilaiset, tapahtuma peruutetaan.
Sinulla on esimerkiksi taulukko, joka sisältää viime vuoden myyntitilaukset. Näitä tietoja päivitetään harvoin, mutta raportteja suoritetaan usein. Optimistisen lukitsemisen avulla tapahtumat eivät estä toisiaan ja järjestelmä toimii tehokkaammin. Valitettavasti viime vuosina on havaittu virheitä, ja päivityksiä on tehtävä. Kun yksi tapahtuma päivittää jokaista riviä, toinen tapahtuma tekee pienen muokkauksen yksittäiseen riviin samaan aikaan. Koska tietojen tilaa muutettiin ensimmäisen tapahtuman suorittamisen aikana, koko tapahtuma peruutetaan.
Stondininen samanaikaisuus
lisen lukossa oletuksena on, että tiedoille tehdään paljon päivityksiä samanaikaisesti. Lukitusten avulla vain yksi päivitys voi tapahtua samanaikaisesti ja tietojen lukeminen estetään päivityksen ajaksi. Tämä voi estää suuret peruuntuminen, kuten edellisessä esimerkissä nähdään, mutta kyselyt voidaan estää tarpeettomasti.
On tärkeää huomioida tietoidesi luonne ja tiedoille suoritettavat kyselyt, kun päätetään, käytetäänkö optimistisea vai sinertäistä samanaikaisuutta optimaalisen suorituskyvyn takaamiseksi.
Tilannevedoksen eristys
SQL Serverissä on viisi eri eristystasoa, mutta tässä moduulissa keskitymme vain READ_COMMITTED_SNAPSHOT_OFF ja READ_COMMITTED_SNAPSHOT_ON. READ_COMMITTED_SNAPSHOT_OFF on SQL Serverin oletuseristystaso. READ_COMMITTED_SNAPSHOT_ON on Azure SQL -tietokannan oletuseristystaso.
READ_COMMITTED_SNAPSHOT_OFF säilyttää lukitukset riveillä, joita asia koskee, tapahtuman loppuun asti, jos kysely käyttää luettua varattua tapahtuman eristystasoa. Vaikka on mahdollista tehdä joitakin päivityksiä, kuten luoda uusi rivi, tämä estää useimmat ristiriitaiset muutokset tietoihin luettaviksi tai päivitettäväksi. Tämä on maaninen samanaikaisuus.
READ_COMMITTED_SNAPSHOT_ON ottaa tiedoista tilannevedoksen. Tämän jälkeen päivitykset tehdään kyseiseen tilannevedokseen, jolloin muut yhteydet voivat kysellä alkuperäisiä tietoja. Tapahtuman lopussa tietojen nykyistä tilaa verrataan tilannevedokseen. Jos tiedot ovat samat, tapahtuma suoritetaan. Jos tiedot eroavat toisistaan, tapahtuma peruutetaan.
Jos haluat muuttaa eristystasoksi READ_COMMITTED_SNAPSHOT_ON antaa seuraavan komennon:
ALTER DATABASE *db_name* SET READ_COMMITTED_SNAPSHOT ON;
Jos haluat muuttaa eristystasoksi READ_COMMITTED_SNAPSHOT_OFF antaa seuraavan komennon:
ALTER DATABASE *db_name* SET READ_COMMITTED_SNAPSHOT OFF;
Jos tietokantaa on muutettu siten, että se ottaa käyttöön luetun valtuutetun tilannevedoksen, kaikki tapahtumat, jotka käyttävät oletusarvoista luettua varattua eristystasoa, käyttävät optimistisea lukitusta.
Huomautus
Tilannevedos eristetään vain luetuissa sidotuissa tapahtumissa. Tämä ei vaikuta tapahtumiin, jotka käyttävät muita eristystasoja.