Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


”становка уровн€ изол€ции транзакции




”правление поведением блокировки и верси€ми строк инструкций Transact-SQL, выданных при подключении к SQL Server, осуществл€етс€ при помощи команды SET TRANSACTION ISOLATION LEVEL.

 

ќдновременно может быть установлен только один параметр уровн€ изол€ции, который продолжает действовать дл€ текущего соединени€ до тех пор, пока не будет €вно изменен. ¬се операции считывани€, выполн€емые в рамках транзакции, функционируют в соответствии с правилами уровн€ изол€ции, если только таблична€ подсказка в предложении FROM инструкции не указывает на другое поведение блокировки или управлени€ верси€ми строк дл€ таблицы.

 

SET TRANSACTION ISOLATION LEVEL

{ READ UNCOMMITTED

| READ COMMITTED

| REPEATABLE READ

| SNAPSHOT

| SERIALIZABLE

}

 

READ UNCOMMITTED

”казывает, что инструкции могут считывать строки, которые были изменены другими транзакци€ми, но еще не были зафиксированы.

“ранзакции, работающие на уровне READ UNCOMMITTED, не используют раздел€емые блокировки, чтобы предотвратить изменение считываемых текущей транзакцией данных другими транзакци€ми. “ранзакции READ UNCOMMITTED также не блокируютс€ монопольными блокировками, которые не позволили бы текущей транзакции считывать измененные другими транзакци€ми, но не зафиксированные строки. ”становка этого параметра позвол€ет считывать незафиксированные изменени€, которые называютс€ недействительными результатами чтени€. «начени€ в данных могут быть изменены и до окончани€ транзакции строки могут по€вл€тьс€ и исчезать в наборе данных. Ётот аргумент действует так же, как и настройка NOLOCK всех таблиц во всех инструкци€х SELECT в транзакции. Ёто наименьшее ограничение уровней изол€ции.

¬ SQL Server 2008 конфликты блокировок при защите транзакций от недействительных результатов чтени€ незафиксированных изменений данных можно сократить с помощью следующего:

Ј уровн€ изол€ции READ COMMITTED с параметром базы данных READ_COMMITTED_SNAPSHOT, наход€щимс€ в состо€нии ON;

Ј уровн€ изол€ции моментального снимка (SNAPSHOT).

 

READ COMMITTED

”казывает, что инструкции не могут считывать данные, которые были изменены другими транзакци€ми, но еще не были зафиксированы. Ёто предотвращает недействительные результаты чтени€. ƒанные могут быть изменены другими транзакци€ми между отдельными инструкци€ми в текущей транзакции, результатом чего будет неповтор€ющеес€ считывание или фиктивные данные. Ётот параметр в SQL Server установлен по умолчанию.

ѕоведение READ COMMITTED зависит от настройки аргумента базы данных READ_COMMITTED_SNAPSHOT.

Ј ≈сли параметр READ_COMMITTED_SNAPSHOT находитс€ в состо€нии OFF (по умолчанию), компонент Database Engine при выполнении операций считывани€ текущей транзакцией использует раздел€емые блокировки дл€ предотвращени€ изменени€ строк другими транзакци€ми. –аздел€емые блокировки также блокируют инструкции от считывани€ строк, измененных другими транзакци€ми, пока не завершитс€ друга€ транзакци€. ѕо завершении инструкции раздел€емые блокировки снимаютс€.

Ј ≈сли параметр READ_COMMITTED_SNAPSHOT находитс€ в состо€нии ON, компонент Database Engine использует управление верси€ми строк дл€ представлени€ каждой инструкции согласованного на уровне транзакций моментального снимка данных в том виде, который они имели на момент начала выполнени€ инструкции. ƒл€ защиты данных от обновлени€ другими транзакци€ми блокировки не используютс€.

ѕри установке параметра READ_COMMITTED_SNAPSHOT разрешаетс€ только то соединение с базой данных, которое выполн€ет команду ALTER DATABASE. ƒо завершени€ инструкции ALTER DATABASE в базе данных не должно быть других открытых соединений. Ѕаза данных не об€зательно должна находитьс€ в однопользовательском режиме.

REPEATABLE READ

”казывает на то, что инструкции не могут считывать данные, которые были изменены, но еще не зафиксированы другими транзакци€ми, а также на то, что другие транзакции не могут измен€ть данные, читаемые текущей транзакцией, до ее завершени€.

–аздел€емые блокировки примен€ютс€ ко всем данным, считываемым любой инструкцией транзакции, и сохран€ютс€ до ее завершени€. Ёто запрещает другим транзакци€м измен€ть строки, считываемые текущей транзакцией. ƒругие транзакции могут вставл€ть новые строки, соответствующие услови€м поиска инструкций, содержащихс€ в текущей транзакции. ѕри повторном запуске инструкции текущей транзакцией будут извлечены новые строки, что приведет к считыванию фантома. ”читыва€ то, что раздел€емые блокировки сохран€ютс€ до завершени€ транзакции и не снимаютс€ в конце каждой инструкции, степень совпадений ниже, чем при уровне изол€ции по умолчанию READ COMMITTED. »спользуйте этот аргумент только в случае необходимости.

SNAPSHOT

”казывает на то, что данные, считанные любой инструкцией транзакции, будут согласованы на уровне транзакции с версией данных, существовавших в ее начале. “ранзакци€ распознает только те изменени€, которые были зафиксированы до ее начала. »нструкции, выполн€емые текущей транзакцией, не вид€т изменений данных, произведенных другими транзакци€ми после запуска текущей транзакции. “аким образом достигаетс€ эффект получени€ инструкци€ми в транзакции моментального снимка зафиксированных данных на момент запуска транзакции.

“ранзакции моментальных снимков не требуют блокировки при считывании данных, за исключением случаев восстановлени€ базы данных. —читывание данных транзакци€ми моментальных снимков не блокирует запись данных другими транзакци€ми. “ранзакции, осуществл€ющие запись данных, не блокируют считывание данных транзакци€ми моментальных снимков.

Ќа этапе отката восстановлени€ базы данных транзакци€ моментальных снимков запросит блокировку, если будет предприн€та попытка считывани€ данных, заблокированных другой откатываемой транзакцией. Ѕлокировка транзакции моментальных снимков сохран€етс€ до завершени€ отката. Ѕлокировка снимаетс€ сразу после предоставлени€.

ѕеред запуском транзакции, использующей уровень изол€ции моментальных снимков, необходимо установить аргумент базы данных ALLOW_SNAPSHOT_ISOLATION в ON. ≈сли транзакци€ с уровнем изол€ции моментальных снимков обращаетс€ к данным из нескольких баз данных, аргумент ALLOW_SNAPSHOT_ISOLATION должен быть включен в каждой базе данных.

Ќевозможно изменить на уровень изол€ции моментальных снимков уровень изол€ции транзакции, запущенной с другим уровнем изол€ции; в этом случае транзакци€ будет прервана. ≈сли транзакци€ запущена с уровнем изол€ции моментальных снимков, ее уровень изол€ции можно измен€ть. “ранзакци€ начинаетс€ в момент первого доступа к данным.

“ранзакци€, работающа€ с уровнем изол€ции моментальных снимков, может просматривать внесенные ею изменени€. Ќапример, если транзакци€ выполн€ет инструкцию UPDATE, а затем инструкцию SELECT дл€ одной и той же таблицы, измененные данные будут включены в результирующий набор.

SERIALIZABLE

”казывает следующее.

Ј »нструкции не могут считывать данные, которые были изменены другими транзакци€ми, но еще не были зафиксированы.

Ј ƒругие транзакции не могут измен€ть данные, считываемые текущей транзакцией, до ее завершени€.

Ј ƒругие транзакции не могут вставл€ть новые строки со значени€ми ключа, которые вход€т в диапазон ключей, считываемых инструкци€ми текущей транзакции, до ее завершени€.

Ј Ѕлокировка диапазона устанавливаетс€ в диапазоне значений ключа, соответствующих услови€м поиска любой инструкции, выполненной во врем€ транзакции. ќбновление и вставка строк, удовлетвор€ющих инструкци€м текущей транзакции, блокируетс€ дл€ других транзакций. Ёто гарантирует, что если кака€-либо инструкци€ транзакции выполн€етс€ повторно, она будет считывать тот же самый набор строк. Ѕлокировки диапазона сохран€ютс€ до завершени€ транзакции. Ёто самый строгий уровень изол€ции, поскольку он блокирует целые диапазоны ключей и сохран€ет блокировку до завершени€ транзакции.

»з-за низкого параллелизма этот параметр рекомендуетс€ использовать только при необходимости.

—ледующа€ таблица показывает негативные эффекты одновременного доступа, допускаемые различными уровн€ми изол€ции.

”ровень изол€ции Ђ√р€зноеї чтение Ќеповтор€ющеес€ чтение ‘антомное чтение
незафиксированного чтени€ ƒа ƒа ƒа
зафиксированного чтени€ Ќет ƒа ƒа
повтор€ющегос€ чтени€ Ќет Ќет ƒа
моментального снимка Ќет Ќет Ќет
упор€дочиваемых транзакций Ќет Ќет Ќет

 

”ровни изол€ции транзакции определ€ют тип блокировки, примен€емый к операци€м считывани€. –аздел€емые блокировки, примен€емые дл€ READ COMMITTED или REPEATABLE READ, как правило, €вл€ютс€ блокировками строк, но при этом, если в процессе считывани€ идет обращение к большому числу строк, блокировка строк может быть расширена до блокировки страниц или таблиц. ≈сли строка была изменена транзакцией после считывани€, дл€ защиты такой строки транзакци€ примен€ет монопольную блокировку, котора€ сохран€етс€ до завершени€ транзакции. Ќапример, если транзакци€ REPEATABLE READ имеет раздел€емую блокировку строки и при этом измен€ет ее, совмещаема€ блокировка преобразуетс€ в монопольную.

¬ любой момент транзакции можно переключитьс€ с одного уровн€ изол€ции на другой, однако есть одно исключение. Ёто смена уровн€ изол€ции на уровень изол€ции SNAPSHOT. “ака€ смена приводит к ошибке и откату транзакции. ќднако дл€ транзакции, котора€ была начата с уровнем изол€ции SNAPSHOT, можно установить любой другой уровень изол€ции.

 огда дл€ транзакции измен€етс€ уровень изол€ции, ресурсы, которые считываютс€ после изменени€, защищаютс€ в соответствии с правилами нового уровн€. –есурсы, которые считываютс€ до изменени€, остаютс€ защищенными с соответствии с правилами предыдущего уровн€. Ќапример, если дл€ транзакции уровень изол€ции измен€етс€ с READ COMMITTED на SERIALIZABLE, то совмещаемые блокировки, полученные после изменени€, будут удерживатьс€ до завершени€ транзакции.

≈сли инструкци€ SET TRANSACTION ISOLATION LEVEL использовалась в хранимой процедуре или триггере, то при возврате управлени€ из них уровень изол€ции будет изменен на тот, который действовал на момент их вызова. Ќапример, если уровень изол€ции REPEATABLE READ устанавливаетс€ в пакете, а пакет затем вызывает хранимую процедуру, котора€ мен€ет уровень изол€ции на SERIALIZABLE, при возвращении хранимой процедурой управлени€ пакету, настройки уровн€ изол€ции мен€ютс€ назад на REPEATABLE READ.

¬ следующем примере устанавливаетс€ уровень изол€ции дл€ сеанса. ƒл€ каждой последующей инструкции Transact-SQL SQL Server сохран€ет все раздел€емые блокировки до конца транзакции.

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

GO

BEGIN TRANSACTION;

GO

SELECT *

FROM HumanResources.EmployeePayHistory;

GO

SELECT *

FROM HumanResources.Department;

GO

COMMIT TRANSACTION;

GO

 





ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2016-11-22; ћы поможем в написании ваших работ!; просмотров: 525 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

Ћаской почти всегда добьешьс€ больше, чем грубой силой. © Ќеизвестно
==> читать все изречени€...

1527 - | 1362 -


© 2015-2024 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.017 с.