Читать реферат по информатике, вычислительной технике, телекоммуникациям: "Версионность в Yukon" Страница 10

назад (Назад)скачать (Cкачать работу)

Функция "чтения" служит для ознакомления с работой. Разметка, таблицы и картинки документа могут отображаться неверно или не в полном объёме!

картину, характерную для обычного блокировочика.

Тип

Описание

Объект

Режим

Статус

spid

TAB

1963154039

IX

GRANT

51

RID

1:1357:2

72057594057326592

U

WAIT

51

PAG

1:1357

72057594057326592

IU

GRANT

51

TAB

1963154039

IX

GRANT

52

RID

1:1357:2

72057594057326592

X

GRANT

52

PAG

1:1357

72057594057326592

IX

GRANT

52

Таблица 3

Snapshot-транзакция (spid 52) ожидает на блокировке (U – WAIT), пока освободится нужная запись (RID 1:1357:2), заблокированная другой транзакцией (spid 51) монопольно (X - GRANT).

Если сейчас вернуться в первое окно и откатить блокирующую транзакцию, то snapshot совершенно спокойно выполнит свое обновление и зафиксируется. Однако если блокирующую транзакцию зафиксировать, то, в отличие от блокировочного поведения, snapshot-транзакция будет отменена, и клиентское приложение получит сообщение об ошибке:

.Net SqlClient Data Provider: Msg 3960, Level 16, State 1, Line 1 Cannot use snapshot isolation to access table 'tst' in database 'AdventureWorks'.Snapshot transaction aborted due to update conflict. Retry transaction.

Более того, для отката snapshot-транзакции ей даже не нужно ожидать снятия блокировки. Чтобы избежать несогласованного изменения, необходимо производить откат даже в том случае, если после старта snapshot-транзакции одна из записей, необходимых для пишущего запроса, была изменена другой транзакцией, успевшей зафиксироваться.

Если в одном из подключений начать snapshot-транзакцию, сделав простую выборку:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT BEGIN TRANSELECT * FROM tst

Затем в другом подключении изменить какую-нибудь запись:

BEGIN TRANUPDATE tst SET y=3 WHERE x=3 COMMIT TRAN

А потом попытаться изменить эту же запись из snapshot-транзакции:

UPDATE tst SET y=3 WHERE x=3COMMIT TRAN

То snapshot транзакция успехом не увенчается, а будет отменена по причине конфликта версий.

Дело в том, что если существует транзакция, зафиксированная после начала работы snapshot-транзакции, и изменения этой транзакции попадают в условия выборки, сделанной snapshot-транзакцией, то вполне могут существовать записи, которые были изменены этой транзакцией после того, как snapshot-запрос их просмотрел, таким образом, что они стали удовлетворять условию snapshot-выборки. То есть получается, что snapshot-транзакция может увидеть только часть изменений, сделанных другой транзакцией, а этого допустить нельзя.

В данном случае поведение Yukon очень похоже на версионное. Но на самом деле он все равно ведет себя немного «по-блокировочному». Проявляется это, например, все в той же ситуации с отсутствием индексов.

Если еще раз выполнить блокирующую транзакцию, не фиксируя ее:

BEGIN TRANUPDATE tst SET y=3 WHERE x=3

А потом попробовать изменить другую запись из snapshot транзакции:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT BEGIN TRANUPDATE tst SET y=-1 WHERE x=4COMMIT TRAN

То snapshot транзакция все равно окажется заблокированной.

Тип

Описание

Объект

Режим

Статус

spid

RID

1:1357:2


Интересная статья: Основы написания курсовой работы