2015-02-06 74 views
1

幾天前,我研究了SqlTransaction,我知道SqlTransaction.Commit()的用途 - 它應該「提交數據庫事務」。 - MSDN。SQLTransaction.Commit()如何工作?

但它是如何工作的?

例如:我寫這樣的一段代碼:

using (SqlTransaction tran = connection.BeginTransaction()) 
{ 
    try 
    { 
     using (SqlCommand cmd = connection.CreateCommand()) 
     { 
      cmd.CommandText = msg.command; 
      cmd.Transaction = tran; 

      cmd.ExecuteNonQuery();       
     } 
    } 
    catch (Exception) 
    { 
     // if all of above have any exception, that's mean my transaction is 
     // failure and my database has no change. 
     return false; 
    } 

    tran.Commit(); 

    // if all of above have no problems, that's mean my transaction is successful 
    return true; 
    connection.Dispose(); 
} 

在這種情況下,SQL Server的是另一臺計算機上。

我猜:commit方法有兩個階段,第一階段:當我執行tran.Commit()時,編譯器會發信號通知SQL Server並與SQL Server交談:「我沒事,請幫我提交(更改)數據」,並且那麼SQL Server將執行編譯器的請求。時段2:SQL Server完全執行編譯器的請求時,執行結果會返回到我們的編譯器。當我們的編譯器收到實現結果時,我們的編譯器將繼續編譯下一個命令行(「返回true」)。

但是,如果在第二個階段,連接中斷,執行結果不會傳回給我們的編譯器。在這種情況下,我們的交易是否成功?數據是否在SQL Server中保存?

附加問題:我關於SQLTransaction.Commit()的兩個週期的預測是否爲true?

謝謝!

+0

在這裏讀到:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.commit%28v=vs.110 %29.aspx – 2015-02-06 05:25:56

+1

我認爲你對你的問題感到困惑。在學習使用C#與SQL Server結婚之前,您可能需要閱讀大約「什麼是數據庫提交」 – Jeyara 2015-02-06 05:28:57

+0

謝謝!我仍然有一個額外的問題:我對SQLTransaction.Commit()的兩個階段的預測是否正確?請幫忙! – GIANGPZO 2015-02-06 07:08:52

回答

3
try 
{ 
    using (var conn = new SqlConnection(/* connection string or whatever */)) 
    { 
     conn.Open(); 

     using (var trans = conn.BeginTransaction()) 
     { 
      try 
      { 
       using (var cmd = conn.CreateCommand()) 
       { 
        cmd.Transaction = trans; 
        /* setup command type, text */ 
        /* execute command */ 
       } 

       trans.Commit(); 
      } 
      catch (Exception ex) 
      { 
       trans.Rollback(); 
       /* log exception and the fact that rollback succeeded */ 
      } 
     } 
    } 
} 
catch (Exception ex) 
{ 
    /* log or whatever */ 
} 

和閱讀這也 https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.commit(v=vs.110).aspx

+0

謝謝!我仍然有一個額外的問題:我對SQLTransaction.Commit()的兩個階段的預測是否正確?請幫忙! - – GIANGPZO 2015-02-06 07:47:43

+0

,你用我的答案進行統計,然後標記我的答案 對不起,我不能得到你的問題? – 2015-02-06 07:55:29

+0

對不起,但我真的不明白你的意見。我所有的聲望是7,所以我沒有權力來標記你的答案。如果我的其他問題不會給您帶來麻煩,請爲我解釋。謝謝! – GIANGPZO 2015-02-06 08:21:12