2017-08-09 89 views
-1

需要得到解釋和澄清有關的SqlTransaction(S)(幫助)的SqlTransaction循環

所以的情況下,基於以下

SqlConnection con = new SqlConnection(GetConnectionString()); 
con.Open(); 

SqlTransaction trans = con.BeginTransaction(); 

bool IsSave = false; 

for(int i = 0; i < obj.Count; i++) 
{ 
    IsSave = Some_Insert_Method_On_Other_Class(obj[i], con, trans); 
    if (!IsSave) 
    { 
     trans.Rollback(); 
     return; 
    } 

    trans.Commit(); 
} 

代碼的問題是,我應該每圈提交一次或者讓它循環然後提交事務?

回答

0

事務是SQL將不同語句綁定到單個原子操作中的方式 - 意思是全部或全部 - 如果一個語句失敗,則事務範圍中的所有前面的語句都回滾,而不是下一個語句交易被執行。

事務可以以兩種不同的方式之一結束 - 它可以是提交的,也可以是回滾的。它只能被提交或回滾一次。

因此,要將該信息翻譯成對您的問題的直接回答,trans.Commit();必須在循環之後。如果單個保存操作失敗,則事務將回滾並退出該方法。只有當它們全部成功時,您纔會執行交易。

順便說一句,只要有可能,就應該換一個實現IDisposable接口在using聲明類的所有實例:

using(var con = new SqlConnection(GetConnectionString())) 
{ 
    con.Open(); 
    using(var trans = con.BeginTransaction()) 
    { 

    bool IsSave = false; 

    for(int i = 0; i < obj.Count; i++) 
    { 
     IsSave = Some_Insert_Method_On_Other_Class(obj[i], con, trans); 
     if (!IsSave) 
     { 
      trans.Rollback(); 
      return; 
     } 
    } 
    trans.Commit(); 
    } 
}