2010-02-02 65 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); 
}