Нивото на изолация на транзакциите в SQL Server и тяхната връзка с мръсни четения, неповторими четения, фантомни четения и др. (аргументи в кода и времеви последователности)
Разбирайки тези проблеми, които могат да възникнат при паралелен достъп до базата данни, можем да продължим да разбираме концепцията за ниво на изолация на базата данни, на прост език: как искате да изолирате едновременните транзакции и до каква степен? Например, ако мръсните четения могат да се толерират или ако не искате едновременните транзакции да имат мръсни четения, те могат да бъдат настроени на ниво на изолация, за да се направи изолацията между едновременните транзакции слаба или тежка.
Колкото по-високо е нивото на изолация, толкова по-малък е шансът за четене на мръсни или непълни данни, но толкова по-сериозно е влошаването на производителността в системи с висока паралелност. Колкото по-ниско е нивото на изолация, толкова по-голямо е подобрението на производителността в конкурентната система, но самите данни може да са непълни.
В SQL Server 2012 можете да зададете нивото на изолация на транзакция (от ниско към високо) чрез следния синтаксис:
ЗАДАЙТЕ НИВО НА ИЗОЛАЦИЯ НА ТРАНЗАКЦИИ { ЧЕТЕНЕ НЕАНГАЖИРАНО | ПРОЧЕТЕТЕ ОТДАДЕН | ПОВТОРЯЕМО ЧЕТЕНЕ | МОМЕНТНА СНИМКА | СЕРИАЛИЗИРУЕМ } [ ; ] Първо, създайте нов тестов скрипт, създайте база данни и вмъкнете тестови данни, както следва:
Създайте нов прозорец A, отворете транзакция, изпълнете операцията за обновяване и изчакате 10 секунди преди да се затвърдите, кодът е следният:
Създаване на нов прозорец B, задайте транзакцията READ UNCOMMITTED (неангажирано четене, най-ниско ниво, лесният проблем е мръсното четене, защото може да чете данните, модифицирани от други транзакции, но не са комитирани.) Прави същото като да зададеш (NOLOCK) върху таблицата на SELECT операторите в транзакция. При заявка към данните, кодът е следният:
Създай нов прозорец C, директно заявява данните по следния начин:
От своя страна,Изпълнете прозорци A, B и C и установете, че при обновяване на данни прозорец B може незабавно да върне данни (Възможно е показанията да са мръсни данни), прозорецът C трябва да изчака, докато прозорецът A завърши изпълнениетоще върне данните, както е показано на фигурата по-долу:
(Прозорец Б)
(Прозорец C)
(Край)
|