请参阅下面的代码:尽管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?即作为批次发布更新。
可能是一个错字,但你的更新没有多大意义。 URN总是在末尾 – Steve 2013-04-20 15:10:30
史蒂夫,这不是一个错字,但我可以看到它为什么造成混乱(因此没有答案)。我介绍了@Steve,Visual Studio中的代码,并且三条SQL语句分别在28,30和32行执行。由于这是一个事务,我不希望发生这种情况。你能否确认连接对象必须在transactiom内打开? – w0051977 2013-04-20 18:11:32
我从来没有使用'TransactionScope',它有什么好处?为什么不使用'Transaction'呢?我刚刚通过MSDN,并没有得到你为什么使用第一个。 – Neolisk 2013-04-20 23:43:59