Evitar bloqueo tabla

21/12/2006 - 09:59 por Santiago Barro | Informe spam
Hola a todos,
tengo una tabla en donde sólo se van insertando y consultando registros.
Nunca se modifican.

Al realizar el proceso de inserción de datos se consulta a la vez un
servicio web, por lo que puede tardar algunos segundos en ejecutar la
inserción.
Al ser ejecutado dentro de una transacción me bloquea la tabla, con lo que
los demás usuarios pueden notar una pequeña espera hasta que se termina la
transacción antes de poder ejecutar la suya.

He visto que puedo utilizar "set transaction isolation level uncommitted"
para evitar el bloqueo y que los demás puedan insertar sus registros, pero
si los intento consultar me sigue bloqueada la tabla, a menos que en la
misma consulta también le indique "set transaction isolation level read
uncommitted".

¿Tengo que indicarlo en cada consulta?

He visto también que existe una opción "with (rowlock)" que parece que sólo
bloquea los registros en lugar de la tabla ¿es así?.

Muchas gracias y un saludo
Santiago Barro
 

Leer las respuestas

#1 cesardgo
09/07/2012 - 23:39 | Informe spam
Santiago Barro escribió el 22/12/2006 08:20 :
Mostrar la cita
Buen dia, continuando con este mismo tema, 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.

Preguntas similares