sql >> Databáze >  >> RDS >> Sqlserver

Rozdíl mezi čtením potvrzeným a opakovatelným čtením

Čtení potvrzeno je úroveň izolace, která zaručuje, že všechna přečtená data byla potvrzena v tuto chvíli je přečteno. Jednoduše omezuje čtenáře v tom, aby viděl jakékoli střední, nezávazné, „špinavé“ čtení. Neslibuje žádný příslib, že pokud transakce znovu vydá čtení, najde Stejné data, data se mohou po přečtení volně měnit.

Opakovatelné čtení je vyšší úroveň izolace, která kromě záruk úrovně potvrzení čtení také zaručuje, že se jakákoli přečtená data nemohou změnit , pokud transakce čte stejná data znovu, najde dříve načtená data na místě, nezměněná a dostupná ke čtení.

Další úroveň izolace, serializovatelná, poskytuje ještě silnější záruku:kromě všeho, co zaručuje opakovatelné čtení, také zaručuje, že žádné nové dat lze vidět při dalším čtení.

Řekněme, že máte tabulku T se sloupcem C s jedním řádkem, řekněme, že má hodnotu '1'. A zvažte, že máte jednoduchý úkol, jako je tento:

BEGIN TRANSACTION;
SELECT * FROM T;
WAITFOR DELAY '00:01:00'
SELECT * FROM T;
COMMIT;

Jedná se o jednoduchý úkol, který vydá dvě čtení z tabulky T se zpožděním 1 minuty mezi nimi.

  • v části READ COMMITTED může druhý SELECT vrátit jakýkoli data. Souběžná transakce může záznam aktualizovat, smazat, vložit nové záznamy. Druhý výběr vždy zobrazí nové údaje.
  • v části REPEATABLE READ druhý SELECT zaručeně zobrazí alespoň ty řádky, které byly vráceny z prvního SELECT nezměněny . Nové řádky mohou být přidány souběžnou transakcí během jedné minuty, ale stávající řádky nelze smazat ani změnit.
  • pod SERIALIZABLE čte, že druhý výběr zaručeně uvidí přesně stejné řádky jako první. Souběžnou transakcí nelze změnit ani odstranit žádný řádek, ani nelze vložit nové řádky.

Pokud se budete řídit výše uvedenou logikou, můžete si rychle uvědomit, že SERIALIZAČNÍ transakce, i když vám mohou usnadnit život, jsou vždy úplně blokovány všechny možné souběžné operace, protože vyžadují, aby nikdo nemohl upravovat, mazat ani vkládat žádný řádek. Výchozí úroveň izolace transakcí .Net System.Transactions rozsah je serializovatelný, a to obvykle vysvětluje propastný výkon, který je výsledkem.

A konečně je tu také úroveň izolace SNAPSHOT. Úroveň izolace SNAPSHOT poskytuje stejné záruky jako serializovatelný, ale ne tím, že vyžaduje, aby žádná souběžná transakce nemohla modifikovat data. Místo toho nutí každého čtenáře vidět jeho vlastní verzi světa (je to vlastní „snímek“). Díky tomu je velmi snadné programovat proti a je také velmi škálovatelné, protože neblokuje souběžné aktualizace. Tato výhoda však přichází s cenou:další spotřeba serverových zdrojů.

Doplňující texty:

  • Úrovně izolace v databázovém stroji
  • Souběžné efekty
  • Výběr úrovní izolace založených na verzování řádků


  1. Jak funguje funkce MID() v MySQL

  2. Jak nastavit hodnotu proměnné pomocí 'execute' v t-sql?

  3. Datový model pro sledování vašeho nejcennějšího majetku

  4. Propojte metabázi s MySQL pro průzkum dat