появилось новое пространство имен
В 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 }