2014-03-24 52 views
1

我發現了一些關於回滾SQL Server查詢的鏈接,但在實現它時遇到了問題。由於我插入和更新的信息需要始終正確,所以我需要確保它在事前有效。現在,我已經有一個try/catch塊,我知道回滾進入catch塊。例如,這是我的代碼:回滾SQL Server查詢

using (SqlConnection conn5 = new SqlConnection(connString)) 
{ 
    try 
    { 
     string query = "INSERT QUERY"; 
     SqlCommand cmd = new SqlCommand(query, conn5); 
     // PARAMETERS 

     conn5.open(); 
     cmd.ExecuteNonQuery(); 
    } 
    catch 
    { 
     cmd.Rollback(); 
    } 
} 

我試圖cmd.RollBack()但它只是在我的臉上吹。

+1

看看交易範圍。 –

+2

在嘗試COMMIT之前,您需要開始一個事務。 – abhi

+1

@abhi:或者回滾。 –

回答

5

您打開一個事務範圍。它將自動執行回滾,除非調用Complete()方法。

using (var tScope = new TransactionScope()) 
using (SqlConnection conn5 = new SqlConnection(connString)) 
{ 
    string query = "INSERT QUERY"; 
    SqlCommand cmd = new SqlCommand(query, conn5); 
    PARAMETERS 

    conn5.open(); 
    cmd.ExecuteNonQuery(); 

    // If an exception is thrown, the call to Complete() will never be reached and the 
    // changes will be rolled back. 
    tScope.Complete(); 
} 
+2

TransactionScope是答案,但不是這樣的。必須閱讀[使用新的TransactionScope()被認爲有害](http://blogs.msdn.com/b/dbrowne/archive/2010/06/03/using-new-transactionscope-considered-harmful.aspx?Redirected=true) –

+0

我不同意。我認爲'Serializable'是一個合理的默認設置,因爲它是很好的證明。較低的隔離級別需要理解缺點。超時問題對於小應用程序不是問題。 –

+0

這是遠不是傻瓜證明。它會導致更多的問題解決。阻止,僵局。如果SERIALIZABLE是一個不錯的默認值,那麼引擎會默認它。它沒有,它默認爲READ COMMITTED,並有很好的理由。即使你不同意這種觀點,仍然存在隱含行爲無變化(最不驚訝的原則)的問題,而且這應該足以成爲警告。 –