Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Rollback TRAN

BEGIN TRAN

BEGIN TRAN

BEGIN TRAN

COMMIT

При этом сохраняется первоначальное состояние таблицы.

в) Вложенные транзакции

Вложенными называются транзакции, выполнение которых иници­ируется из тела уже активной транзакции.

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

Если транзакция самого нижнего вложенного уровня завершена неудачно и отменена, то все транзакции верхнего уровня, включая транзакцию первого уровня, будут отменены.

Кроме того, если несколько транзакций нижнего уровня были завершены успешно (но не зафиксированы), однако на среднем уровне (не самая верх­няя транзакция) неудачно завершилась другая транзакция, то в соответствии с требованиями ACID произойдет откат всех транзакций всех уровней, включая успешно завершенные.

Только когда все транзакции на всех уров­нях завершены успешно, происходит фиксация всех сделанных изменений.

Каждая команда COMMIT TRANSACTION работает только с последней начатой транзакцией. Да­же если в команде COMMIT TRANSACTION указано имя транзакции более высокого уровня, будет завершена транзакция, начатая последней.

Если где-либо на любом уровне вложенности используется команда ROLLBACK TRAN[SACTION] (без указания имени транзакции), то откатываются все транзакции, включая транзакцию самого верх­него уровня.

Более того, в команде ROLLBACK TRANSACTION разрешается указывать только имя самой верхней транзакции. Имена любых вложенных тран­закций игнорируются, и попытка их указания приведет к ошибке.

Итак, при откате транзакции любого уровня вложенности всегда про­исходит откат всех транзакций.

Если же требуется откатить лишь часть транзакций, можно использовать команду SAVE TRANSACTION, с помо­щью которой создается точка сохранения.

 

Пример 2. Использование вложенных транзакций

INSERT Товар (Название_товара, категория) VALUES ('кефир’,40)

INSERT Товар (Название_товара, категория) VALUES ('ряженка', 40)

INSERT Товар (Название_товара, категория) VALUES {'йогурт', 40)

Здесь происходит возврат на начальное состояние таблицы, посколь­ку выполнение команды ROLLBACK TRAN без указания имени транзакции откатывает все транзакции.


Часть 3. Управление блокировками в среде MS SQL Server

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

MS SQL Server поддерживает раз­личные уровни блокирования объектов (или детализацию блокировок), начиная с отдельной строки таблицы и заканчивая базой данных в це­лом.

Менеджер блокировок автоматически оценивает, какое количество данных необходимо блокировать, и устанавливает соответствующий тип блокировки. Это позволяет поддерживать равновесие между производи­тельностью работы системы блокирования и возможностью пользовате­лей получать доступ к данным.

Блокирование на уровне строки позво­ляет наиболее точно управлять таким доступом, поскольку блокируют­ся только действительно изменяемые строки. Множество пользователей могут одновременно работать с данными с минимальными задержками. Платой за это является увеличение числа операций установки и снятия блокировок, а также большое количество служебной информации, ко­торое приходится хранить для отслеживания установленных блокиро­вок.

При блокировке на уровне таблицы производительность системы блокирования резко увеличивается, так как необходимо установить лишь одну блокировку и снять ее только после завершения транзакции. Пользователь при этом имеет максимальную скорость доступа к дан­ным. В то же время они не доступны никому другому, потому что вся таблица заблокирована. Приходится ожидать, пока текущий пользова­тель завершит работу.

Действия, выполняемые пользователями при работе с данными, сводятся к следующим операциям: чтению, добавлению, удалению и изменению данных. В зависимости от выполняемых действий сервер накладывает на данные один из следующих типов блокировки:

· Коллективная блокировка. Накладывается при выполнении операций чтения данных (оператор SELECT). Если сервер устано­вил на ресурс коллективную блокировку, то пользователь может быть уверен, что уже никто не сможет удалить или изменить эти данные.

· Блокировка обновления. Если на ресурс установлена коллективная блокировка и для этого ресурса устанавливается блокировка обнов­ления, то никакая транзакция не сможет дополнительно наложить коллективную блокировку или блокировку обновления.

· Монопольная блокировка используется, если транзакция изменяет данные. Когда сервер устанавливает монополь­ную блокировку на ресурс, то никакая другая транзакция не может ни прочитать, ни изменить данные. Монопольная блокировка не совместима ни с какими другими блокировками, то есть ни одна блокировка, включая монопольную, не может быть дополнительно наложена на ресурс.

· Блокировка массивного обновления. Накладывается сервером, если выполняются операции массивного пополнения таблицы. В это время несколько процессов могут одновременно вставлять строки в таблицу. При этом запре­щается обращение к таблице процессам, выполняющим иные действия.

 

Помимо перечисленных типов блокировок SQL Server поддерживает ряд специальных блокировок, предназначенных для повы­шения производительности и функциональности обработки данных.

 

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

 

Кроме того, в среде SQL Server существует два других типа блокировок:

· блокировка диапазона ключей;

· блокировка схемы (метаданных, описы­вающих структуру объекта).

 

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

 

Блокировка схемы используется при выполнении команд модифи­кации структуры таблиц для обеспечения целостности данных.

«Мертвые» блокировки

«Мертвые» (или тупиковые) блокировки характерны для многополь­зовательских систем.

«Мертвая» блокировка возникает, когда две тран­закции блокируют два блока данных и для завершения любой из них ну­жен доступ к данным, заблокированным ранее другой транзакцией.

Для завершения каждой транзакции необходимо дождаться, пока блокиро­ванная другой транзакцией часть данных будет разблокирована. Но это невозможно, так как вторая транзакция ожидает разблокирования ресур­сов, используемых первой.

Без применения специальных механизмов обнаружения и снятия «мертвых» блокировок нормальная работа транзакций будет нарушена.

Если в системе установлен бесконечный период ожидания завершения транзакции (а это задано по умолчанию), то при возникновении «мертвой» блокировки для двух транзакций вполне возможно, что, ожидая освобож­дения заблокированных ресурсов, в тупике окажутся и новые транзакции.

Чтобы избежать подобных проблем, в среде MS SQL Server реализован спе­циальный механизм разрешения конфликтов тупикового блокирования.

 

Для этих целей сервер снимает одну из блокировок, вызвавших кон­фликт, и откатывает транзакцию, инициализировавшую эту блокировку.

При выборе блокировки, которой необходимо пожертвовать, сервер исходит из сооб­ражений минимальной стоимости.

 

Полностью избежать возникновения «мертвых» блокировок нельзя.

Хотя сервер и имеет эффективные механизмы снятия таких блокировок, все же при написании приложений следует учитывать вероятность их воз­никновения и предпринимать все возможные действия для предупрежде­ния этого.

«Мертвые» блокировки могут существенно снизить произво­дительность, поскольку системе требуется достаточно много времени для их обнаружения, отката транзакции и повторного ее выполнения.

 

Для минимизации возможности образования «мертвых» блокиро­вок при разработке кода транзакции следует придерживаться следующих правил:

• выполнять действия по обработке данных в постепенном порядке, чтобы не создавать условия для захвата одних и тех же данных;

• избегать взаимодействия с пользователем в теле транзакции;

• минимизировать длительность транзакции и выполнять ее по воз­можности в одном пакете;

• применять как можно более низкий уровень изоляции.

<== предыдущая лекция | следующая лекция ==>
Begin TRAN | Set transaction isolation level READ committed
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 594; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.