Buen dia, tengo una situacion de bloqueos en la que quisiera aclarar algunas dudas.
Estoy utilizando vb.net 2008 accesando una base de datos sql server 2008, base de datos Pubs con una tabla adicional creada llamada parametros. esto para propositos de pruebas de bloqueos.
Cuando Inicio una transaccion en vb.net, despues de ejecutar un select o un update, la tabla completa se bloquea. Existe alguna forma de solo bloquear los registros afectados o que NO bloquee las tablas de consulta? he intentado varias cosas y no he podido encontrar alguna forma de hacer esto.
Para ver el efecto de los bloqueos estoy corriendo el siguiente script paso a paso y que despues de aplicar el Cmd.ExecuteNonQuery() para la tabla authors, poder consultar la tabla pubs de almenos los registros NO incluidos en el update, sin que haya terminado la transaccion. actualmente me bloquea toda la tabla incluyendo la tabla de parametros (he intentado las instrucciones con y sin las opciones de NoLock y RowLock):
Dim Trans As SqlClient.SqlTransaction = Nothing
Dim cn As New SqlClient.SqlConnection("server=miserver\sql2008; DataBase=pubs; user id=sa; pwd=sa")
Try
Dim Cmd As New SqlClient.SqlCommand("Select * from parametros with(nolock) ", cn)
Dim Ds As New DataSet
Dim SQL As String = ""
cn.Open()
'' Trans = cn.BeginTransaction(IsolationLevel.Snapshot)
Trans = cn.BeginTransaction
'obteniendo parametros.
SQL = "Select * from parametros with(nolock)"
Cmd.CommandText = SQL
Cmd.CommandType = CommandType.Text
Cmd.Transaction = Trans
Dim Da As New SqlClient.SqlDataAdapter(Cmd)
Da.Fill(Ds)
If Ds.Tables(0).Rows.Count > 0 Then
'lectura de parametros
Dim Num As Integer = Ds.Tables(0).Rows(0)(0)
Num += 1
'actualizacion de parametros.
SQL = "Update Parametros With(ROWLOCK) Set Consecutivo=@Num"
Cmd.CommandText = SQL
Cmd.Parameters.Clear()
Cmd.Parameters.AddWithValue("@Num", Num)
Cmd.ExecuteNonQuery()
SQL = "Update Authors With(ROWLOCK) Set Phone=@Telefono, Zip=@Zip Where au_lname=@Nombre"
Cmd.CommandText = SQL
Cmd.Parameters.Clear()
Cmd.Parameters.AddWithValue("@Telefono", "2203-050" & Num)
Cmd.Parameters.AddWithValue("@Zip", 10000 + Num)
Cmd.Parameters.AddWithValue("@Nombre", "Einstein")
Cmd.ExecuteNonQuery()
LblMensajes.Text = "Actualizado consecutivo: " & Num
End If
Trans.Commit()
cn.Close()
------------------------------------------
Saludos y se agradece la ayuda.