有什么办法可以暂时锁定行

时间:2019-08-15 03:49:55

标签: sql-server vb.net

我在VB.NET应用程序中使用了sql服务器,其中该应用程序的多个实例是从其他服务器(CITRIX)运行的。我正在整理和拾取一个单独的行以进行处理,并立即将该行标记为在列中已选择,以便其他实例不会拾取相同的行并浪费时间。问题是,在拾取行和按选择进行更新之间,应用程序的另一个实例正在拾取行。已建议我将其与DB Lock一起使用,但是这个概念对我来说不是很清楚,例如它是否可以解决我的问题,是否需要管理员权限才能使用它(我在客户端DB中没有管理员权限)等。下面是我使用的代码段。

Dim MyConnection As SqlConnection
Try
MyConnection = New SqlConnection(connString)
MyConnection.Open()
Dim tableName As String = myTableName
Dim sqlQuery As String = "Select Top 1 * from " + tableName + " where "<some condition>
Dim MyCommand As SqlDataAdapter = New SqlDataAdapter(sqlQuery, MyConnection)
Dim DS as DataSet = New DataSet
MyCommand.Fill(DS, tableName)
If DS.Tables(0).Rows.Count >= 1 Then
    sqlQuery = "UPDATE " + tableName + " SET Fld = @fld  where Cond1= '" + DS.Tables(0).Rows(0).Item("Cond1").ToString + "'"
    Dim cmd As New Data.SqlClient.SqlCommand(sqlQuery)
    cmd.CommandType = CommandType.Text
    cmd.Parameters.Add("@fld", Data.SqlDbType.VarChar).Value = "Picked" 
    Try
        cmd.Connection = MyConnection
        cmd.ExecuteNonQuery() 
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End If
Catch ex As Exception
    MsgBox(ex.ToString)
Finally
    MyConnection.Close()
End Try

我希望它以这样的方式进行:如果实例拾取一行,直到它完成对行的更新,该行将对表上具有相同查询的其他实例不可见,但是其他实例将继续工作与其他行同时显示。

1 个答案:

答案 0 :(得分:0)

我看到两个选择:

  • 将您的SELECTUPDATE查询更改为单个UPDATE查询。我没看到您的SELECT在哪里买东西。
  • 如果确实需要SELECT,则在数据库上使用存储过程来处理数据库服务器端的SELECTUPDATE。您可以在交易期间锁定该行。参见:Transaction Locking and Row Versioning Guide

请注意,通常应尝试将数据库查询移至存储过程。这不仅减少了来回移动数据集的网络流量,还提高了可靠性,将数据库代码与UI分开,允许更新过程而不必推出新版本的客户端应用程序,还避免了SQL注入