Обработка транзакций для нескольких сохраненных вызовов Procs - PullRequest
0 голосов
/ 17 июня 2011

У меня есть приложение WinNet .Net 3.5, в котором выполняется несколько шагов.Каждый шаг выполняет некоторые вычисления и вызывает один или несколько сохраненных процедур. Некоторые из этих сохраненных процедур выполняют несколько обновлений / вставок в таблицы в базе данных Oracle.

В пользовательском интерфейсе приложения есть кнопки «Обработка» и «Отмена процесса» длякаждый шаг. Если пользователь нажимает кнопку отмены процесса, приложение должно выполнить откат базы данных до ее предыдущего состояния ... т.е.сделайте транзакцию ATOMIC.

Итак, мой вопрос здесь такой: возможно ли это? .. и, если да, для достижения этой атомарности, о каких вещах мне нужно позаботиться на стороне приложения и базы данных?

Нужно ли использовать API транзакций .Net здесь? Также необходимо ли использовать блоки BEGIN / COMMIT TRANSACTION в этих хранимых процессах ??

Пожалуйста, поделитесь своими мыслями.

Спасибо.

1 Ответ

2 голосов
/ 17 июня 2011

Во-первых, да, а во-вторых, ваше приложение C # (в частности, уровень задач) должно управлять транзакциями, sprocs НЕ ДОЛЖЕН быть транзакционным, если вы не можете гарантировать возможность делать вложенные транзакции, которые откатываются при откате родительского элемента (иЯ не могу говорить по этому вопросу о оракуле WRT)

http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oracleconnection_methods%28v=VS.71%29.aspx

С вашим объектом OracleConnection, прежде чем вы начнете всю свою работу, вызовите BeginTransaction ().Затем выполните все операции OracleCommand с этим соединением.

Затем, если вы вызываете Transaction.RollBack или Transaction.Commit всю работу sproc, которую вы делаете, вы должны откатиться или зафиксировать.

Пример прямо по ссылке:

public void RunOracleTransaction(string myConnString)
{
   OracleConnection myConnection = new OracleConnection(myConnString);
   myConnection.Open();

   OracleCommand myCommand = myConnection.CreateCommand();
   OracleTransaction myTrans;

   // Start a local transaction
   myTrans = myConnection.BeginTransaction(IsolationLevel.ReadCommitted);
   // Assign transaction object for a pending local transaction
   myCommand.Transaction = myTrans;

   try
   {
 myCommand.CommandText = "INSERT INTO Dept (DeptNo, Dname, Loc) values (50,     'TECHNOLOGY', 'DENVER')";
     myCommand.ExecuteNonQuery();
 myCommand.CommandText = "INSERT INTO Dept (DeptNo, Dname, Loc) values (60,     'ENGINEERING', 'KANSAS CITY')";
     myCommand.ExecuteNonQuery();
     myTrans.Commit();
     Console.WriteLine("Both records are written to database.");
   }
   catch(Exception e)
   {
     myTrans.Rollback();
     Console.WriteLine(e.ToString());
     Console.WriteLine("Neither record was written to database.");
   }
   finally
   {
     myConnection.Close();
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...