1

所以这就是问题所在。

我需要插入 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);
    }
4

1 回答 1

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);
}
于 2010-02-03T19:41:18.800 回答