Пиши Дома Нужные Работы

Обратная связь

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

 

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

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

 

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

 

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

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

 

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

 

Дополнительная информация.

Функция @@TRANCOUNT возвращает количество активных транзакций.

Функция @@NESTLEVEL возвращает уровень вложенности транзакций.

 

Пример. Вложенные транзакции.

 

BEGIN TRAN

INSERT Товар (Название, остаток)

VALUES ('v',40)

BEGIN TRAN

INSERT Товар (Название, остаток)

VALUES ('n',50)

BEGIN TRAN

INSERT Товар (Название, остаток)

VALUES ('m',60)

ROLLBACK TRAN

 

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

 

Пример: Этот пример создает таблицу, формирует три уровня вложенных транзакций и затем фиксирует вложенные транзакции. Хотя каждая инструкция COMMIT TRANSACTION имеет аргумент transaction_name, не существует связи между инструкциями COMMIT TRANSACTION и BEGIN TRANSACTION.



Аргументы transaction_name удобны для понимания и помогают программисту удостовериться в том, что закодировано верное количество фиксированных транзакций и чтобы уменьшить значение параметра @@TRANCOUNT до 0 и таким образом зафиксировать внешнюю транзакцию.

 

IF OBJECT_ID(N'TestTran',N'U') IS NOT NULL

DROP TABLE TestTran;

GO

CREATE TABLE TestTran (Cola INT PRIMARY KEY, Colb CHAR(3));

GO

--Этот оператор устанавливает значение @@TRANCOUNT на 1

BEGIN TRANSACTION OuterTran;

GO

PRINT N'Количество активных транзакций после BEGIN OuterTran = '

+ CAST(@@TRANCOUNT AS NVARCHAR(10));

GO

INSERT INTO TestTran VALUES (1, 'aaa');

GO

--Этот оператор устанавливает значение @@TRANCOUNT на 2

BEGIN TRANSACTION Inner1;

GO

PRINT N'Количество активных транзакций после BEGIN Inner1 = '

+ CAST(@@TRANCOUNT AS NVARCHAR(10));

GO

INSERT INTO TestTran VALUES (2, 'bbb');

GO

-- Этот оператор устанавливает значение @@TRANCOUNT на 3.

BEGIN TRANSACTION Inner2;

GO

PRINT N'Количество активных транзакций после BEGIN Inner2 = '

+ CAST(@@TRANCOUNT AS NVARCHAR(10));

GO

INSERT INTO TestTran VALUES (3, 'ccc');

GO

--Этот оператор изменяет @@TRANCOUNT на 2.

-- Ничто не совершается.

COMMIT TRANSACTION Inner2;

GO

PRINT N'Количество активных транзакций после COMMIT Inner2 = '

+ CAST(@@TRANCOUNT AS NVARCHAR(10));

GO

--Этот оператор изменяет @@TRANCOUNT на 1.

-- Ничто не совершается.

COMMIT TRANSACTION Inner1;

GO

PRINT N'Количество активных транзакций после COMMIT Inner1 = '

+ CAST(@@TRANCOUNT AS NVARCHAR(10));

GO

-- Этот оператор уменьшает @@TRANCOUNT до 0

-- завершая выполнение внешней транзакции OuterTran.

COMMIT TRANSACTION OuterTran;

GO

PRINT N'Количество активных транзакций после COMMIT OuterTran = '

+ CAST(@@TRANCOUNT AS NVARCHAR(10));

GO

 

Результат работы:

Количество активных транзакций после BEGIN OuterTran = 1

 

(строк обработано: 1)

Количество активных транзакций после BEGIN Inner1 = 2

 

(строк обработано: 1)

Количество активных транзакций после BEGIN Inner2 = 3

 

(строк обработано: 1)

Количество активных транзакций после COMMIT Inner2 = 2

Количество активных транзакций после COMMIT Inner1 = 1

Количество активных транзакций после COMMIT OuterTran = 0

Модели конкурентного доступа.

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

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

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

Параллелизм:

Раздел Описание
Эффекты параллелизма Различные уровни управления параллелизмом могут иметь разные побочные эффекты. Понимание этих эффектов важно для выбора подходящего уровня управления параллелизмом для приложения.
Типы управления параллелизмом Оптимистичное управление параллелизмом предназначено для сведения к минимуму блокирования модуля чтения-записи. При применении оптимистичных способов управления параллелизмом операции считывания не используют блокировку считывания, запрещающую изменение данных. Пессимистичное управление параллелизмом обеспечивает работу операций считывания с текущими данными, которые не могут быть изменены. При применении пессимистичных способов управления параллелизмом операции считывания используют блокировку считывания, запрещающую изменение данных.Блокировки, устанавливаемые операциями считывания, снимаются по завершении операций.
Уровни изоляции в ядре СУБД Уровни изоляции транзакций определяют, использует транзакция оптимистичное или пессимистичное управление параллелизмом, а также уровень защиты от других транзакций, одновременно обращающихся к данным.

 

 

Теория управления параллелизмом предлагает два способа осуществления управления параллелизмом.

· Пессимистическое управление параллелизмом

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

· Оптимистическое управление параллелизмом

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

Уровень изоляции транзакции определяет, могут ли другие (конкурирующие) транзакции вносить изменения в данные, измененные текущей транзакцией, а также может ли текущая транзакция видеть изменения, произведенные конкурирующими транзакциями, и наоборот (будут рассмотрены далее).

 

SQL Server 2005 Database Engine использует следующие механизмы для гарантии целостности транзакций и поддержания согласованности баз данных, когда несколько пользователей обращаются к одним и тем же данным в одно и то же время:

· Блокирование (пессимистический конкурентный доступ)

· Управление версиями строк (оптимистический конкурентный доступ)

 

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

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

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

 

Блокирование.

Database Engine, как и все реляционные СУБД, использует блокировки (замки) для гарантии согласованности данных в базе данных в случае многопользовательского к ней доступа.Каждая программа приложения блокирует нужные ей данные, гарантируя этим, что никакая другая программа не может изменять те же самые данные. Когда другая программа приложения запрашивает модификацию заблокированных данных, система или останавливает эту программу, выдавая ошибку, или переводит программу в состояние ожидания.

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

 






ТОП 5 статей:
Экономическая сущность инвестиций - Экономическая сущность инвестиций – долгосрочные вложения экономических ресурсов сроком более 1 года для получения прибыли путем...
Тема: Федеральный закон от 26.07.2006 N 135-ФЗ - На основании изучения ФЗ № 135, дайте максимально короткое определение следующих понятий с указанием статей и пунктов закона...
Сущность, функции и виды управления в телекоммуникациях - Цели достигаются с помощью различных принципов, функций и методов социально-экономического менеджмента...
Схема построения базисных индексов - Индекс (лат. INDEX – указатель, показатель) - относительная величина, показывающая, во сколько раз уровень изучаемого явления...
Тема 11. Международное космическое право - Правовой режим космического пространства и небесных тел. Принципы деятельности государств по исследованию...



©2015- 2024 pdnr.ru Все права принадлежат авторам размещенных материалов.