Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Поддержка транзакции в языке SQL и библиотеках ADO.Net



Собственно, для использования транзакций в языке SQL имеется не так много инструкций. Тем не менее, в разных СУБД эта поддержка реализована несколько по-разному, так что описать общие для всех команды не представляется возможным. В нашем курсе мы опираемся на СУБД Microsoft SQL Server, поэтому в качестве примера возьмем эту систему.

По умолчанию, в SQL Server каждый запрос является отдельной транзакцией. Это так называемый режим автофиксации транзакций (autocommit mode). Если есть необходимость управлять транзакциями явным образом, этот режим может быть отключен при помощи команды SET IMPLICIT_TRANSACTIONS ON. Вернуться к режиму автофиксации можно выполнив ту же команду, но заменив ON на OFF.

Чтобы явным образом начать транзакцию, в SQL Server используется следующее выражение:

BEGIN TRAN[SACTION]

[[transaction_name]

[WITH MARK ['description']]]

Необязательный аргумент transaction_name позволяет задать имя транзакции, чтобы в дальнейшем обращаться к ней по этому имени. Опция WITH MARK позволяет задать описание для транзакции, которое попадет в журнал транзакций и может быть в дальнейшем использовано для выбора информации о конкретной транзакции.

По умолчанию, транзакции выполняются с уровнем изолированности READ COMMITTED. Если требуется использовать другой уровень изолированности, можно использовать следующую команду:

SET TRANSACTION ISOLATION LEVEL

{READ COMMITTED| READ UNCOMMITTED |REPEATABLE READ| SERIALIZABLE}

После выполнения команды все транзакции в данном сеансе будут выполняться с установленным уровнем изолированности.

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

Для того, чтобы зафиксировать транзакцию, можно выполнить команду COMMIT [WORK]. После ее завершения все сделанные в рамках транзакции изменения данных будут внесены в БД.

SQL Server также поддерживает следующую команду фиксации:

COMMIT TRAN[SACTION] [transaction_name]

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

Аналогично выглядит и команда отката транзакции – ROLLBACK [WORK]. И точно также, SQL Server поддерживает вариант:

ROLLBACK TRAN[SACTION] [transaction_name]

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

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

SAVE TRAN[SACTION] savepoint_name

Savepoint_name – имя точки сохранения, которое надо использовать, чтобы выполнить откат до нее. Откат выполняется при помощи команды ROLLBACK TRANSACTION savepoint_name. После выполнения этой команды будет восстановлено состояние на точку сохранения.

Для использования транзакций в ADO.Net имеется специальный класс Transaction. Точнее говоря, соответствующие классы имеются для каждого провайдера данных. Для SQL Server класс называется SQLTransaction.

Класс имеет очень простой интерфейс. Для работы используются методы:

· Commit() - как легко догадаться, фиксирует транзакцию;

· Save(string SavepointName) - создает точку сохранения с переданным в качестве аргумента именем;

· Rollback() – откатывает транзакцию;

· Rollback(string SavepointName) – откатывает транзакцию до точки сохранения с заданным именем.

Чтобы начать транзакцию, необходимо вызвать метод BeginTransaction(string TransactionName) из объекта класса SQLConnection. Метод возвращает объект-транзакцию, в контексте которой можно выполнять команды. Чтобы выполнить команду в контексте транзакции, необходимо в свойство Transaction объекта SQLCommand записать ссылку на нужную транзакцию.

Приведем небольшой пример из документации к Visual Studio:

private static void ExecuteSqlTransaction(string connectionString)

{

using (SqlConnection connection = new SqlConnection(connectionString))

{

connection.Open();

SqlCommand command = connection.CreateCommand();

SqlTransaction transaction;

// Запускаем локальную транзакцию

transaction = connection.BeginTransaction("SampleTransaction");

// Мы должны задать для объекта Command оба свойства -

// и соединение, и транзакцию

command.Connection = connection;

command.Transaction = transaction;

try

{

command.CommandText =

"Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";

command.ExecuteNonQuery();

command.CommandText =

"Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";

command.ExecuteNonQuery();

// Попытка зафиксировать транзакцию.

transaction.Commit();

Console.WriteLine("Обе записи внесены в базу данных.");

}

catch (Exception ex)

{

//Здесь перехватываются исключения, возникающие в процессе

//выполнения и фиксирования транзакции.

Console.WriteLine("Commit Exception Type: {0}", ex.GetType());

Console.WriteLine(" Message: {0}", ex.Message);

// Попытка откатить транзакцию, в которой возникли ошибки.

try

{

transaction.Rollback();

}

catch (Exception ex2)

{

// В этом блоке перехватываются исключения, возникшие

// при попытке откатить транзакцию на сервере, например

// использование закрытого соединения.

Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());

Console.WriteLine(" Message: {0}", ex2.Message);

}

}

}

}

Из приведенного примера видно, как можно использовать транзакции в ADO.Net.

Контрольные вопросы.

1. Дайте понятие транзакции.

2. Перечислите основные свойства транзакций.

3. Поясните роль транзакций в восстановлении данных.

4. Назовите проблемы, возникающие при одновременном доступе к данным.

5. Перечислите уровни изоляции транзакций.

6. Дайте понятие блокировки данный и перечислите виды блокировок.

7. Опишите основные возможности по управлению транзакциями в SQL Server.


Рекомендуемая литература

1. Дейт, К. Д. Введение в системы баз данных: пер. с англ. / К. Д. Дейт. - 8-е изд.. - М.; СПб.; Киев: Вильямс, 2005. - 1328 с.: ил.

2. Кодд, Е. Ф. Реляционная модель данных для больших совместно используемых банков данных. http://citforum.ru/database/classics/codd/

3. http://ru.wikipedia.org/wiki/12_правил_Кодда

4. Баркер, Р. CASE*Method – моделирование взаимосвязей между сущностями.

5. Диго, Светлана Михайловна. Базы данных: проектирование и использование: учеб. для студентов вузов / С. М. Диго. - М.: Финансы и статистика, 2005. - 592 с.: ил.. - Библиогр.: с. 576-579

6. Виейра, Роберт. Программирование баз данных Microsoft SQL Server 2005 для профессионалов / Р. Виейра. - М.; СПб.; Киев: Диалектика, 2008. - 1064 с.. - (Программистам от программистов). - Предм. указ.: с. 1046-1064.

7. Функции SQL: справочник программиста / Э. Джоунс [и др.]. - М.; СПб.; Киев: Диалектика, 2007. - 760 с.. - (Программистам от программистов). - Предм. указ.: с. 741-760.

8. Селко, Джо. SQL для профессионалов. Программирование / Д. Селко. - М.: ЛОРИ, 2004. - 442 с.: ил.

9. Когаловский, Михаил Рувимович. Энциклопедия технологий баз данных / М. Р. Когаловский. - М.: Финансы и статистика, 2002. - 800 с.: ил.





Дата публикования: 2014-11-26; Прочитано: 324 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.012 с)...