另一个连接打开时打开连接

时间:2013-11-05 14:51:24

标签: sql-server vb.net

我需要调用一个函数来执行某些查询,同时打开另一个连接并进行事务处理。

好的,我觉得这很奇怪,这里有一些代码:

主要部分:

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秒,之后我收到错误

1 个答案:

答案 0 :(得分:2)

您可以根据需要使用任意数量的连接,只需确保它们不会相互干扰。 SQL服务器非常努力保持数据完整性,因此如果一个未提交的事务与另一个未提交的事务冲突,则会出现死锁。

您可能想要使用transaction isolation level,默认为SQL COMMOURED for SQL server,尝试将其设置为READ UNCOMMITTED。请阅读文档以了解后果。

从以上链接:

  

在SQL Server中,您还可以使用以下任一方法最小化锁定争用,同时保护事务免受未提交数据修改的脏读:

     
      
  • READ COMMITTED隔离级别,READ_COMMITTED_SNAPSHOT数据库选项设置为ON。
  •   
  • SNAPSHOT隔离级别。
  •