我需要调用一个函数来执行某些查询,同时打开另一个连接并进行事务处理。
好的,我觉得这很奇怪,这里有一些代码:
主要部分:
Using connection As New SqlConnection(connectionString)
connection.Open()
Dim command As SqlCommand = connection.CreateCommand()
Dim transaction As SqlTransaction
transaction = connection.BeginTransaction("myTransaction")
command.Connection = connection
command.Transaction = transaction
command.CommandText = sSQL
Try
command.ExecuteNonQuery()
Dim functionResult As String = myFunction(param1, param2)
If functionResult <> "" Then
'error! i need to rollback the first query done here!
transaction.Rollback()
else
transaction.Commit()
End If
Catch ex As Exception
transaction.Rollback()
End Try
End If
End Using
myFunction 做了很多事情,还有很多查询。每个查询都需要重新打开连接(这次没有事务),但每次我尝试执行我的函数内的第一个查询时,我都会从数据库中获得超时错误(30秒后)。
我知道我可以做这项工作“复制粘贴”已经打开的连接中的所有myFunction代码并使用已经打开的连接,但我不止一次使用该函数而且我不想弄乱我的代码
我该如何解决这个问题?
编辑以获取更多信息: 这是我正在使用的代码的已缩减版本,但这里是“myFunction”所做的简化版本:
Dim connectionString As String = "my connection string"
Dim queryString As String = "SELECT id FROM foo WHERE param1 = @myValue"
Dim ds As DataSet = New DataSet()
Try
Using connection As New SqlConnection(connectionString)
Dim command As New SqlCommand(queryString, connection)
connection.Open()
command.CommandText = queryString
command.Parameters.Add("@myValue", SqlDbType.Int).Value = 10
Dim adapter As New SqlDataAdapter()
adapter.SelectCommand = command
adapter.Fill(ds, "randomName")
If ds.Tables("randomName").Rows.Count < 0 Then
'error!
connection.Close()
Return "error"
End If
End Using
Catch ex As Exception
Return "Database error - " & ex.Message
End Try
代码执行(即使在调试中)冻结adapter.Fill(ds, "randomName")
命令30秒,之后我收到错误
答案 0 :(得分:2)
您可以根据需要使用任意数量的连接,只需确保它们不会相互干扰。 SQL服务器非常努力保持数据完整性,因此如果一个未提交的事务与另一个未提交的事务冲突,则会出现死锁。
您可能想要使用transaction isolation level,默认为SQL COMMOURED for SQL server,尝试将其设置为READ UNCOMMITTED。请阅读文档以了解后果。
从以上链接:
在SQL Server中,您还可以使用以下任一方法最小化锁定争用,同时保护事务免受未提交数据修改的脏读:
- READ COMMITTED隔离级别,READ_COMMITTED_SNAPSHOT数据库选项设置为ON。
- SNAPSHOT隔离级别。