我们正在追踪其中一个应用程序中令人讨厌的超时错误。
我想知道在应用程序中使用SQL事务与使用TSQL语句写入存储过程有什么区别(如果有)。我们需要重组存储的proc和vb代码才能使其正常工作,但我不确定目前是否值得这样做。
Public Sub RetrieveTData(ByVal cID As String, ByVal cnn As SqlConnection) As Boolean
Dim sqlTran As SqlTransaction
cnn.Open()
sqlTran = cnn.BeginTransaction
Try
If Not DataAlreadyTransferred(cID) Then
Dim Command As New SqlCommand("usp_BigNasty_CopyDataFromDB1toDB2")
Command.CommandType = CommandType.StoredProcedure
Command.Transaction = sqlTran
Command.Parameters.AddWithValue("@cID", cID)
Command.Connection = cnn
Command.ExecuteNonQuery()
sqlTran.Commit()
Endif
Catch ex As Exception
sqlTran.Rollback()
Throw
Finally
cnn.Close()
End Try
End Sub
由于try / catch的编写方式,我们不确定超时发生在
DataAlreadyTransferred()
还是usp_BigNasty_CopyDataFromDB1toDB2
中。我们可以重组此代码,但是要花一周左右的时间才能投入生产(今天的测试/开发中没有错误)DB1-永久存储,也由其他应用程序使用
DB2-工作集,仅由Web App使用
DataAlreadyTransferred(cID)
首先检查DB2是否具有记录的任何副本,如果DB2有并且这些记录是干净的,它将删除它们(DB1中的数据可能已更改,我们需要最新的版本)。如果DB2的数据很脏,则将其保留下来,并且不会删除任何数据。usp_BigNasty_CopyDataFromDB1toDB2
从大约20-30个不同的表中复制行,并从perm副本中将其从DB1复制到DB2,从本质上创建了一个Web应用程序可以访问的工作集我们知道这是低效的,并且正在研究改进它的方法,只是还没有时间...
我相信通过在应用程序代码中进行事务处理,可以锁定比实际需要更多的表。如果我们将它们移至存储的proc,一次将锁定较少的表,从而提高了我们消除今天遇到的死锁条件/超时问题的机会。只是不确定。
感谢您的任何投入。
最佳答案
与往返和多次通话相比,您的交易的开放时间长于所需时间。
我建议使用一个存储的proc来测试,清除和写入=对服务器的一个原子调用。
我还将考虑使用复制来使数据实时保持实时运行,如果DB2包含大量DB1,那么甚至还会进行镜像。让数据库引擎来做吗?
关于asp.net - SQL事务:TSQL与VB.NET?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4228213/