Руководство по работе с БД Firebird с использованием библиотеки ADO .Net 2.0

       

появилось новое пространство имен


В Net Framework 2 появилось новое пространство имен System.Transaction, которое предоставляет поддержку распределенных транзакций. IBProvider поддерживает распределенные транзакции за счет расширения COM+ Microsoft Transaction Server (MTS). Распределенные транзакции позволяют нам преодолеть границы базы данных и, к примеру, выполнять действия с различными БД в контексте одной распределенной транзакции.

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

public void TransactionScopeTest() { //TransactionScrope автоматически свяжет локальные транзакции с распределенной

//В данном контексте будет две локальных транзакции на каждое подключение и одна

//распределенная.

using (TransactionScope scope = new TransactionScope()) { //автоматически будет создана локальная транзакция

OleDbConnection con1 = ConnectionProvider.CreateConnection(); con1.Open();

//insert command

OleDbCommand cmd_insert = new OleDbCommand( "insert into country (country,currency) values (:country,:currency)",con1); cmd_insert.Parameters.AddWithValue("country", "Russia"); cmd_insert.Parameters.AddWithValue("currency", "Rouble"); Assert.AreEqual(1, cmd_insert.ExecuteNonQuery());

//автоматически будет создана ещё одна локальная транзакция OleDbConnection con2 = ConnectionProvider.CreateConnection(); con2.Open();

cmd_insert.Connection = con2; cmd_insert.Parameters["country"].Value = "Latvia"; cmd_insert.Parameters["currency"].Value = "Lat"; Assert.AreEqual(1, cmd_insert.ExecuteNonQuery());

//Фиксация распределенной транзакции //Для всех локальных транзакций будет вызван метод Commit()

scope.Complete();

//Если ранее распределенная транзакция не была завершена для всех локальных //транзакций будет вызван метод Rollback при вызове IDispose.Dispose()



}

//TransactionScope будет использовать локальную транзакцию

//т.к. все команды выполняются в одном контексте

using (TransactionScope scope = new TransactionScope()) { OleDbConnection con1 = ConnectionProvider.CreateConnection(); con1.Open();

//проверяем, что в предыдущем контексте были добавлены записи

OleDbCommand cmd_select = new OleDbCommand( "select count(*) from country where country=:country", con1); cmd_select.Parameters.Add("country", OleDbType.BSTR);

//удаляем записи OleDbCommand cmd_delete = new OleDbCommand( "delete from country where country=:country", con1); cmd_delete.Parameters.Add("country", OleDbType.BSTR);

cmd_select.Parameters["country"].Value = "Russia"; cmd_delete.Parameters["country"].Value = "Russia"; Assert.AreEqual(1, cmd_select.ExecuteScalar()); Assert.AreEqual(1, cmd_delete.ExecuteNonQuery());

cmd_select.Parameters["country"].Value = "Latvia"; cmd_delete.Parameters["country"].Value = "Latvia"; Assert.AreEqual(1, cmd_select.ExecuteScalar()); Assert.AreEqual(1, cmd_delete.ExecuteNonQuery());

scope.Complete(); //commit

} //rollback }


Содержание раздела