处理多个存储过程调用的事务

时间:2011-06-17 15:08:24

标签: c# oracle transactions atomic

我有一个.Net 3.5 winforms应用程序,其中运行了多个步骤。 每个步骤都进行一些计算并调用一个或多个存储过程。这些存储过程中的一些在oracle数据库的表中执行多个更新/插入。

App UI具有每个步骤的“进程”和“取消进程”按钮。如果使用命中取消进程按钮,则应用程序应该将数据库状态回滚到其先前状态...即。使交易成为ATOMIC。

所以,我的问题是,这可能是吗??如果是的话,要实现这种原子性,我需要在应用程序和数据库方面处理所有事情吗?

我是否需要在此处使用.Net的事务API?此外,是否需要在那些存储过程中使用BEGIN / COMMIT TRANSACTION块?

请分享您的想法。

感谢。

1 个答案:

答案 0 :(得分:2)

首先,是的,其次,您的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();
   }
}