0

请看下面的代码:

    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

即使 scope.complete 被注释掉了,这三个更新语句也会被执行。我相信这是因为连接是在 TransactionScope 之外打开的。

如果我想循环访问 100 万人来发布这些更新,那么有两种选择:

1)进行所有更新并在最后提交对数据库的更改 2)在每个循环上提交更改 - 然后我必须为每个循环打开一个新连接。

开发人员是否总是选择选项 1?即批量发布更新。

4

2 回答 2

0

从阅读文档看来,事务范围需要使用块(缺少)来包装连接。所以打开范围,打开连接,执行命令,提交范围。

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

Connections、Commands、TransactionScope 和 Readers 都实现了 IDisposable 并需要一个 using 块(除非您反编译代码并验证 IDisposable 中的活动是无意义的,就像它们用于 DataSet、DataTable 和 Bulk Insert 一样)

以及 Neolisk 所说的一切。批量更新,除非您有一个独特的场景,即部分更新会成为某种灾难。(更可能的是,大规模事务将是另一种更严重的灾难——日志文件被填满,或者数据库引擎在消化一个巨大的事务时疯狂地检查了很长时间的午餐)

于 2013-04-21T00:27:22.097 回答
0
  1. 您不应该一次提交所有更改。有 100 万次更新,撤消日志会很大,您可能会遇到锁定问题,整个操作可能会花费不合理的时间。

  2. 批量发布更新是个好主意,只需记住将批量大小设置为合理的值。例如,1000 条记录。您可以让您的更新并行运行 - 它应该更快。如果您可以将更新组织成逻辑部分,例如按部门的人员 - 请这样做,从长远来看,它将提高代码的可维护性。

另外,考虑使用参数。

于 2013-04-20T23:50:34.907 回答