【问题标题】:Handling transactions for multiple stored procs calls处理多个存储过程调用的事务
【发布时间】:2011-06-17 15:08:23
【问题描述】:

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

应用程序 UI 的每个步骤都有“处理”和“取消处理”按钮。如果用户点击取消处理按钮,应用程序应该将数据库状态回滚到之前的状态......即。进行 ATOMIC 交易。

所以,我的问题是,这可能吗..?如果是的话,为了实现这种原子性,我需要在应用程序和数据库端处理什么?

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

请分享你的想法。

谢谢。

【问题讨论】:

    标签: c# oracle transactions atomic


    【解决方案1】:

    首先,是的,其次,您的 C# 应用程序(特别是任务层)应该管理事务,存储过程不应该是事务性的,除非您可以保证能够在父级回滚时执行回滚的嵌套事务(并且我不能在这一点上发言 WRT oracle)

    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();
       }
    }
    

    【讨论】:

    • Oracle 不执行嵌套事务(并且不需要 BEGIN TRANSACTION)
    • Oracle 支持可能打开或关闭的自动事务,但对于来自 .NET 的连接,它们是关闭的,因此连接仍然必须启动事务的开始。请参阅与 PL SQL 等效的“SET TRANSACTION”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2016-07-18
    相关资源
    最近更新 更多