2010-02-02 39 views
1

所以这就是问题所在。.net Oracle Data Provider事务回滚不起作用

我需要插入到tableA中并获取其新的行ID。之后,我必须将该ID插入到tableB中。我必须在insertA插入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); 
    } 

回答

1

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

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

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

所以修改我贴的代码,它看起来像这样

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