2017-08-09 8 views
-1

私はループごとに一度コミットする必要があり、そうする場合は、問題がある(ヘルプ)の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(); 
} 

以下のコードに基づいて、あるのSqlTransaction(S)

について説明し、明確に取得する必要がありますまたは単にループさせてからトランザクションをコミットさせますか?

答えて

0

トランザクションは、異なるステートメントを1つのアトミック操作にバインドする方法です。つまり、1つのステートメントが失敗した場合、トランザクションスコープ内のすべての前のステートメントはロールバックされ、次のステートメントはロールバックされません。トランザクションが実行されます。

トランザクションは2つの異なる方法のいずれかで終了することができます。コミットまたはロールバックされます。一度だけコミットまたはロールバックできます。

したがって、その情報を質問への直接回答に変換するには、trans.Commit();がループの後に来る必要があります。単一の保存操作が失敗した場合、トランザクションはロールバックされ、メソッドを終了します。すべてが成功した場合にのみ、トランザクションをコミットします。

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

ところで、可能な限り、あなたはusing文でIDisposableインターフェイスを実装するクラスのすべてのインスタンスをラップする必要があります

関連する問題