2013-04-20 81 views
0

請參閱下面的代碼:儘管scope.complete被註釋掉的TransactionScope - 承諾在每次迭代

Imports System.Transactions 
Imports System.Data.SqlClient 
Imports System.Web.Configuration 

Partial Class _Default 
    Inherits System.Web.UI.Page 

    Private _ConString As String 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     Try 
      Dim objDR As SqlDataReader 
      _ConString = WebConfigurationManager.ConnectionStrings("TestConnection").ConnectionString 
      Dim objCon As New SqlConnection(_ConString) 
      Dim objCommand As New SqlCommand 
      objCommand.CommandText = "SELECT * FROM Person" 
      'Using scope As New TransactionScope() 
      objCon.Open() 
      Using scope As New TransactionScope() 
       objCommand.Connection = objCon 
       objDR = objCommand.ExecuteReader 
       Do While objDR.Read 

        Dim i As String = objDR("id2") 
        Dim objCommand2 As New SqlCommand 
        objCommand2.Connection = objCon 
        objCommand2.CommandText = "UPDATE Person SET URN=1 WHERE id2 = '" & i & "'" 
        objCommand2.ExecuteNonQuery() 'line 28 
        objCommand2.CommandText = "UPDATE Person SET URN=2 WHERE id2 = '" & i & "'" 
        objCommand2.ExecuteNonQuery() 'line 30 
        objCommand2.CommandText = "UPDATE Person SET URN=3 WHERE id2 = '" & i & "'" 
        objCommand2.ExecuteNonQuery() 'line 32 
       Loop 
       'scope.Complete() 'line 34 
      End Using 
      objDR.Close() 
     Catch ex As Exception 
      Throw 
     End Try 
    End Sub 
End Class 

三個update語句執行。我相信這是因爲連接在TransactionScope之外打開。

如果我想要循環通過一個萬人發出這些更新則有兩種選擇:

1)請所有更新,並在年底 2更改提交到數據庫)提交每個循環的變化 - 然後我將不得不爲每個循環打開一個新的連接。

開發者是否總是選擇選項1?即作爲批次發佈更新。

+0

可能是一個錯字,但你的更新沒有多大意義。 URN總是在末尾 – Steve 2013-04-20 15:10:30

+0

史蒂夫,這不是一個錯字,但我可以看到它爲什麼造成混亂(因此沒有答案)。我介紹了@Steve,Visual Studio中的代碼,並且三條SQL語句分別在28,30和32行執行。由於這是一個事務,我不希望發生這種情況。你能否確認連接對象必須在transactiom內打開? – w0051977 2013-04-20 18:11:32

+0

我從來沒有使用'TransactionScope',它有什麼好處?爲什麼不使用'Transaction'呢?我剛剛通過MSDN,並沒有得到你爲什麼使用第一個。 – Neolisk 2013-04-20 23:43:59

回答

0
  1. 您不應該一次提交所有更改。如果有100萬次更新,撤消日誌會很大,您可能會遇到鎖定問題,整個操作可能會花費不合理的時間。

  2. 批量發佈更新是一個好主意,只要記住將批量大小設置爲合理的。例如,1000條記錄。你可以讓你的更新並行運行 - 它應該更快。如果你可以把你的更新整理成邏輯片斷,比如按部門劃分的人 - 請這樣做,從長遠來看,這會提高代碼的可維護性。

另外,請考慮使用參數。

0

通過閱讀文檔,它看起來像事務處理範圍需要使用塊(缺少)來包裝連接。所以打開範圍,打開連接,執行命令,提交範圍。

http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx

連接,命令的TransactionScope和讀者都實現IDisposable並需要使用塊(除非你反編譯的代碼,並驗證IDisposable的活動都是無稽之談,就像他們爲數據集,數據表和散裝插入東西)

Neolisk說的一切。批量更新除非您有一個獨特的場景,部分更新會導致某種災難。 (更可能是大規模的交易將是另一種更糟糕的災難 - 日誌文件填滿或數據庫引擎檢查午餐瘋狂很長時間,而它消化了一筆鉅額交易)