Konzistence databáze je také jedním z důležitých ukazatelů pro měření výkonu DBMS. V současnosti většina komerčních databází (DB2, SQL Server) používá protokol Two-Phase Locking (2PL) pro řízení souběžnosti, který zajišťuje serializaci provádění současných transakcí. Nicméně 2PL musí všechna data uzamknout, než je může číst nebo zapisovat. V matici kompatibility blokování jsou zámky S (Share Locks) a X zámky (Exclusive Locks) nekompatibilní, takže když transakce 1 provádí čtení dat A (plus S lock) a transakce 2 chce zapisovat do dat (přidat zámek X), musí transakce 2 počkat, až transakce 1 uvolní S zámek na data A, než bude pokračovat. Multi-Version Concurrency Control (MVCC) tento problém dobře řeší. V systému s více verzemi každé zápisové data generují novou verzi a operace čtení může podle potřeby číst příslušnou verzi, takže operace čtení a zápisu se navzájem neblokují. MVCC zvyšuje souběžnost, ale zároveň zavádí režijní zátěž při udržování více verzí.
Databázový engine Microsoft SQL Server představuje novou implementaci stávající úrovně izolace transakcí – zavázaných čtení, která poskytují snapshoty na úrovni příkazů pomocí verzování řádků. Databázový engine SQL Server také zavádí novou úroveň izolace transakcí – snapshoty, které poskytují snímky na úrovni transakcí, které také využívají verzování řádků.
Nastavení READ_COMMITTED_SNAPSHOT databáze na ON umožňuje závaznou izolaci čtení pomocí verzování řádků. Nastavení ALLOW_SNAPSHOT_ISOLATION databáze na ON umožňuje izolaci snímků. Když je pro databázi povolena některá z možností, databázový engine udržuje verzi každého řádku, který je upraven. Kdykoli transakce upraví řádek, obraz řádku před úpravou je zkopírován na stránku ve skladu verzí. Úložiště verzí je soubor datových stránek v tempdb. Pokud existuje více řádků pro úpravu transakce, více verzí této řádky bude propojeno v řetězci verzí. Operace čtení pomocí verzování řádků získá poslední verzi každého řádku, která byla zavázána v době začátku transakce nebo příkazu.
Aplikace napsané pro SQL Server 2008 nebo nové pro SQL Server implementují izolaci read-commitů pomocí verzování řádků tím, že specifikují úroveň transakční izolace pro read-commity, když je možnost READ_COMMITTED_SNAPSHOT databáze zapnutá. Všechny čtení se budou dívat na verzi řádku, která byla zavázána na začátku výroku. To poskytne snapshot dat na úrovni příkazu.
Aplikace napsané pro SQL Server implementují izolaci snímků tím, že specifikují úroveň izolace transakcí snapshotu, když je možnost ALLOW_SNAPSHOT_ISOLATION databáze zapnuta. Všechny čtení v snapshot transakci se budou dívat na verzi řádku, která byla potvrzena při zahájení transakce. To poskytne snímek dat na úrovni transakce.
U transakcí používajících izolační úrovně založené na řádku čtení nevyžadují sdílené zámky dat. To znamená, že čtečky používající verzování řádků nebrání ostatním čtenářům nebo spisovatelům v přístupu ke stejným datům. Podobně spisovatel nepřekáží čtenáři. Nicméně autoři si navzájem překážejí (i když běží na úrovni izolace založené na verzování řádků). Dvě zápisové operace nemohou současně upravovat stejná data.
Funkce Snapshot Isolation rozšiřuje rámec zamykaní v SQL Server 2008 tím, že umožňuje aplikacím zobrazit hodnoty před jakýmikoli úpravami dat. Tím se zabrání uzamčení aplikace, přičemž stále poskytujeme skutečně odeslaná data. Read Committed Snapshot v SQL Server 2008 vyžaduje aktivaci správce databáze, což umožňuje čtení dat pouze pro čtení. Takže řízení souběžnosti pouze pro čtení v SI je velmi dobré, ale není jasné, zda to platí i pro aktualizační transakce. Je méně výhodné, když dlouhodobé aktualizační transakce konkurují krátkodobým transakcím na vysoké úrovni. Pokud se transakce napříč databázemi pokusí použít standard Snapshot Isolation (SI) místo nastavení všech databází, transakce selže. To nepochybně vytváří určité překážky škálovatelnosti. Zdá se, že Microsoft má ještě dlouhou cestu k dosažení svého SI silnějšího než specifikace SQL 92.
Před jakoukoli úpravou si vytvořte kopii předchozí verze a všechny následné operace čtení přečtou zkopírovanou verzi, přičemž úprava vytvoří novou verzi. Tímto způsobem,Operace čtení a zápisu se navzájem neblokují. Výhodou použití tohoto mechanismu verzování řádků je, že souběžnost programu je relativně vysoká, ale nevýhodou je, že i když uživatel nečte špinavá data, může jít o datovou hodnotu, která je upravována a brzy vyprší. Pokud data upravíte na základě této expirované hodnoty, způsobí to logickou chybu。
SQL příkazy:
Referenční odkazy:
Přihlášení k hypertextovému odkazu je viditelné.
Přihlášení k hypertextovému odkazu je viditelné.
Přihlášení k hypertextovému odkazu je viditelné.
Přihlášení k hypertextovému odkazu je viditelné.
Přihlášení k hypertextovému odkazu je viditelné.
Přihlášení k hypertextovému odkazu je viditelné.
|