SQL Server 2000 DTS. Часть 12. Поддержка транзакций

ПУБЛИКАЦИИ  

По материалам статьи Marcin Policht: SQL Server 2000 DTS Part 12 - Transactional Support

В заключительной статье этой серии мы обсудим поддержку транзакций в SQL Server 2000 Data Transformation Services. Транзакции в рамках DTS пакетов преследуют ту же самую цель, как и другие операции SQL Server - они отвечают требованиям ACID, что расшифровывается, как атомарность, последовательность, изоляция и продолжительность. Атомарность означает, что рассматриваемый в качестве транзакции модуль команд должен быть исполнен полностью или не должен выполняться вообще. Последовательность определяет состояние исходных данных. Изоляция определяет независимость исполняемых в рамках транзакции команд одного модуля от других. Продолжительность отражает постоянный статус изменений данных.
По умолчанию, каждая задача исполняется независимо от других в рамках одного DTS пакета (с точки зрения транзакций). Если происходит ошибка, выполнение текущей задачи прерывается. Несмотря на то, что Вы можете использовать параметры настройки из раздела Error handling на закладке Logging диалогового окна Package properties ("Fail package on the first error" - который определяет, будет ли в этот момент прервана работа всего пакета или управление исполнением будет передано другой задаче, имеющей соответствующую этой ошибке логику работы, например, запуск следующей задачи при успешном завершении, обработка ошибки или завершение работы пакета), никакой из представленных там двух методов не может повлиять на те операции, которые уже были исполнены до ошибки. Чтобы повлиять на предшествующие ошибке операции, Вы должны объявить все связанные единой логикой задачи, как входящие в одну транзакцию. Таким образом, Вы сможете гарантировать, что все они будут завершены успешно или будет выполнен откат к исходному состоянию, если произойдёт ошибка или сбой.
Однако, Вы должны помнить, что пакет может одновременно выполнять только одну транзакцию и что не каждый пакет может правильно отрабатывать транзакции. Ограничения существуют для некоторых типов подключений и задач, используемых в рамках пакета:

  • Подключения зависят от возможностей по поддержки транзакций, которыми обладает используемый для доступа к данным провайдер. Эта поддержка имеется у Microsoft OLE DB Provider for SQL Server, ODBC источников данных (если используемый ODBC драйвер имеет атрибут подключения SQL_ATT_ENLIST_IN_DTC и он был установлен) и Microsoft Data Link (если соответствующий OLE DB провайдер имеет интерфейс ITtransactionJoin). Более детальную информацию об этой теме Вы можете найти в документации по OLE DB и ODBC.
  • Задачи могут быть сгруппированы по трём категориям, основанным на присущих им уровнях поддержки транзакций. Первая категория состоит из задач, которые не пригодны в транзакциях из-за особенностей их работы, например, FTP, Dynamic Properties, Send Mail или Copy SQL Server Object tasks. Задачи второй категории (ActiveX Script и Execute Process) могут создать и управлять транзакциями внутри себя (как часть скрипта или процесса), но не могут участвовать в DTS транзакциях, использующих другие задачи. И, наконец, третья категория включает задачи, которые поддерживают транзакции полностью - Bulk Insert, Data Driven Query, Transform Data, Execute Package, Execute SQL и Message Queue.

Так как DTS при обработке своих транзакций использует Microsoft Distributed Transaction Coordinator (MS DTC), Вы должны убедиться, что служба MS DTC будет запущена до запуска пакета. Кроме того, стоит рассмотреть несколько возможных вариантов конфигурации, которые затрагивают транзакционное поведение пакета, и его задач (задачи представляют собой исполняемые модули, часто называемые шагами, если речь идёт о транзакциях в DTS):

  • "Use transactions" чек - бокс на закладке Advanced диалогового окна Package Properties должен быть включён, что бы пакет мог использовать внутренние транзакции. По умолчанию, эта опция включена.
  • "Commit on successful package completion" чек - бокс на закладке Advanced диалогового окна Package Properties. Эта опция завершит все открытые транзакции при завершении пакета. Это не всегда касается транзакций, которые уже завершены (как часть параметров задач).
  • Раскрывающийся список "Transaction isolation level", на закладке Advanced диалогового окна Package Properties, определяет (как Вы могли догадаться), уровень изоляции транзакций (который задаёт механизм блокировок) и может иметь одно из следующих значений:

    • "Read Committed" – параметр, используемый по умолчанию, который задаёт такой уровень изоляции транзакции, при котором изменения, вносимые другими параллельно выполняющимися транзакциями, не видимы до завершения.
    • "Read Uncommitted" - позволяет видеть в текущей транзакции не завершённые другими, параллельными транзакциями изменения.
    • "Repeatable Read" - гарантирует, что данные, получаемые текущей транзакцией, находятся в непротиворечивом состоянии до завершения транзакции.
    • "Serializable" - самый строгий уровень изоляции, гарантирующий полную независимость текущей транзакции (наиболее высокий уровень блокировки).
    • "Chaos" – похож на "Read Uncommitted" и разрешает видеть незавершённые изменения, но не блокирует изменения до завершения транзакции. Т.к. этот метод в SQL Server имеет серьёзный недостаток (нет возможности отката изменений), он используется редко.
    Менее строгие варианты (read uncommitted и chaos) повышают параллелизм (возможность одновременного исполнения нескольких транзакций) но и повышают вероятность противоречивых чтений (например, non-repeatable чтение, «грязное» чтение и фантомные чтения), в то время как для более строгих вариантов (read committed, repeatable read или serializable) это менее вероятно.
  • "Join transaction if present" чек - бокс на закладке Options диалогового окна Workflow Properties (доступного из контекстного меню задачи, после выбора опции Workflow -> Workflow Properties) предписывает включение задачи в транзакцию, которая уже исполняется, и не была ещё завершена. Иначе, исполнение этой задачи будет приводить к появлению новой транзакции.
  • "Commit transaction on successful completion of this step", этот чек – бокс, расположенный на закладке Options диалогового окна Workflow Properties, отмечает транзакцию, как завершённую, при успешном завершении задачи (предполагая, что на уровне пакета чек – бокс "Use transactions" был включён).
  • "Rollback transaction on failure" чек – бокс на закладке Options диалогового окна Workflow Properties, приводит к откату транзакции всякий раз, когда у задачи фиксируется сбой (и опять предполагаем, что на уровне пакета чек – бокс "Use transactions" был включён).

Теперь давайте посмотрим на очень простой пример, иллюстрирующий использование транзакций в DTS пакетах. Мы создадим две задачи, настроив их как части одной транзакции, и рассмотрим варианты работы такого пакета. В качестве источников данных мы будем использовать текстовый файл, содержащий единственную строку:

4;Speedy Gonzalez;(504)555-1234

Также, мы будем использовать таблицу Shippers базы данных Northwind. В начале, нужно создать текстовый файл (например, C:\Temp\Shippers.txt) и скопировать в него показанную выше строку. Далее, запустите DTS Designer и создайте в новом пакете подключение на основе Microsoft OLE DB Provider for SQL Server к базе данных Northwind. Из меню Task (или инструментальной панели с левой стороны) выберете задачу Bulk Insert Task и настройте её свойства, вписав описание (например, BULK INSERT Shippers), выбрав существующее подключение к Northwind из списка Existing connection, указав в качестве получателя данных таблицу Shippers, и определив C:\Temp\Shippers.txt в качестве нашего файла - источника данных. Убедитесь, что в качестве разделителя столбцов используется точка с запятой (Semicolon). Закройте диалоговое окно Bulk Insert Task Properties, нажмите правую кнопку мыши на значке задачи и выберите из контекстного меню опцию Workflow -> Workflow Properties. В диалоговом окне свойств Workflow переключитесь на закладку Options и выберите переключатель "Join transaction if present". Это приведёт к созданию новой транзакции при запуске задачи. Закройте это диалоговое окно. Создайте вторую задачу, выбрав из меню Task задачу Execute SQL Task. В диалоговом окне Task Properties введите описание (например, "INSERT ShipperID 1"), укажите Northwind в списка Existing connection, и введите следующий T-SQL запрос:

SET IDENTITY_INSERT Northwind.dbo.Shippers ON
GO
INSERT INTO Shippers (ShipperID, CompanyName, Phone)
VALUES (1, 'Road Runner', '(503) 555-4567')
GO
SET IDENTITY_INSERT Northwind.dbo.Shippers OFF
GO

Этот запрос будет пытаться создать дубль строк в таблице Shippers, что, разумеется, приведёт к ошибке. Так как мы планируем исполнять обе задачи в одной транзакции, изменения, внесённые BULK INSERT, будут откачены назад и содержание таблицы Shippers останется таким же, как и до исполнения пакета. Чтобы завершать настройку, перейдите в диалоговое окно Workflow Properties задачи Execute SQL Task, и включите переключатели "Join transaction if present" и "Rollback transaction on failure". После этого, подтвердите окончание настроек, нажав на кнопку OK. Из интерфейса DTS Designer, добавьте (workflow) элемент связи процессов "On Success" между задачами Execute SQL и Bulk Insert. Сохраните и исполните пакет. В диалоговом окне Executing DTS Package Вы должны увидеть процесс исполнения, показывающий успешное прохождение первой задачи и отказ второй. И, наконец, проверьте содержимое таблицы Shippers и убедитесь, что оно не изменилось.
Вы можете опробовать дополнительные варианты настройки (например, установив для первой задачи "Commit transaction on successful completion of this step"), чтобы продолжить исследование транзакционных возможностей, встроенных в DTS. Также, Вы можете обратиться к Books On Line для получения информации о более сложных настройках пакета, например, добавление в пакете контрольных точек транзакций, унаследованных транзакций или параллельного исполнения.
Эта статья является заключительной в кратком обзоре SQL Server 2000 Data Transformation Services, но автор собирается вернуться к этой теме при рассмотрении DTS Security, которое он планирует осветить в следующей серии статей, называемой SQL Server 2000 Security.

[В начало]


Перевод: Александра Гладченко  2004г.

ПУБЛИКАЦИИ

Скачать электронную карту Ангарска бесплатно
Сайт управляется системой uCoz