【问题标题】:.net Oracle Data Provider transaction rollback not working.net Oracle 数据提供程序事务回滚不起作用
【发布时间】:2011-01-12 09:46:19
【问题描述】:

这就是问题所在。

我需要插入 tableA 并获取它的新行 ID。之后,我必须将该 ID 插入到 tableB 中。我必须在插入 tableA 之后提交,这样当我尝试插入 tableB 时,我不会得到外键异常。

现在,我的理解是,如果在插入 tableB 的函数中引发异常,当 try-catch 块捕获异常时,原始插入到表中的操作将被回滚。它没有这样做。

我在某处犯了错误,但我不知道在哪里。有没有办法在这里完成我所需要的?

try
    {

        tableAinsert.ExecuteNonQuery();
        transaction.Commit();

        id= Int32.Parse(tableAinsert.Parameters["id"].Value.ToString());

        if (vsType == "I")
        {
            tableBinsert(vsType, eventId, id);
        }

    }
    catch (Exception err)
    {
         transaction.Rollback();
        throw (err);
    }

【问题讨论】:

    标签: .net oracle11g rollback


    【解决方案1】:

    那里,我的一位同事指出了问题。

    似乎必须使用相同的连接和相同的事务才能回滚这样的多步插入。而且每个事务只能有一个提交。

    这意味着必须修改我的每个具有自己的连接和事务命令的函数,以首先接受 OracleConnection 和 OracleTransaction 参数,并去掉 commit() 代码和其他相关行。

    所以修改我贴的代码,会是这个样子

    OracleConnection conn = new OracleConnection();
     // .... create your command, set the connection string, etc, etc
    var transaction = conn.BeginTransaction();
    cmd.Transaction = transaction;
    
    try
    {
    
        tableAinsert.ExecuteNonQuery();
    
    
        id= Int32.Parse(tableAinsert.Parameters["id"].Value.ToString());
    
        if (vsType == "I")
        {
            tableBinsert(vsType, eventId, id, conn, transaction);
        }
    
        transaction.Commit();  //Moved this commit to the end of the block
    
    }
    catch (Exception err)
    {
         transaction.Rollback();
        throw (err);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2011-01-31
      • 2011-01-17
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      相关资源
      最近更新 更多