2013-04-20 69 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说的一切。批量更新除非您有一个独特的场景,部分更新会导致某种灾难。 (更可能是大规模的交易将是另一种更糟糕的灾难 - 日志文件填满或数据库引擎检查午餐疯狂很长时间,而它消化了一笔巨额交易)