我需要做一個相對簡單的事務,但是這會影響5-6個表,所以我通過了幾個關於如何做到這一點的教程,因爲我之前從未使用過事務,我eneded了在using(...)
塊包裝每一個新的查詢是這樣的:在ADO.NET事務中使用using()塊
SqlTransaction transaction = null;
SqlConnection connection = null;
string localConnString =System.Web.Configuration.WebConfigurationManager..;
try
{
connection = new SqlConnection(localConnString);
connection.Open();
string insertSomeValues = "some SQL INSERT query"..
using (SqlCommand command = new SqlCommand(insertSomeValues, connection))
{
..
}
using(SqlCommand newCommand = new SqlCommand(otherQuery, connection))
{
..
}
transaction.Commit();
}
catch
{
transaction.Rollback();
}
finally
{
connection.Close();
}
所以,我希望你有這個想法。我認爲這個實現存在的問題是,由於using
塊在塊中,如果在此過程中引發異常,其他代碼仍將被執行,更重要的是transaction.Commit();
。這使得事務無用,因爲當我想要一個事務(全部或全部)時,我最終得到部分更改database
。
由於我對這個話題缺乏經驗,我想知道怎樣正確處理這種情況。在其中一個例子有一個bool
標誌,指示當前操作如何去,並呼籲transaction.Commit();
之前有某種形式的檢查:
if (!hasErrors)
{
transaction.Commit();
}
,但因爲我,包括我的交易serveral的表,我有一些查詢用於獲取信息或檢查某些內容,使用標誌的想法並不是很誘人。我正在考慮刪除using()
塊,以便每當發生錯誤時(至少我認爲這是應該發生的),我直接進入主catch塊。所以......有一些想法,但處理這個問題的實際方法是什麼?