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 :
Muchas gracias a los dos por vuestras opiniones,
supongo que teneis razón y será mejor realizar las consultas al
servicio web
fuera de la transacción.

El problema es que antes de insertar cada fila, debo ejecutar un
procedimiento en un servicio web el cual me devuelve un valor de retorno que
debo guardar con la fila en mi base de datos.
Supongo que a nivel de rendimiento será mejor guardar los registros y
realizar un UPDATE después actualizando dicho valor de retorno.

Ya miraré cómo lo soluciono.

Muchas gracias de nuevo y un saludo.
Santiago Barro


"Gustavo Larriera (MVP)"
escribió en el mensaje
news:
Hola Santiago Barro,

Santiago Barro wrote:

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.




Voy a dar una opinión general ya que no dispongo de los detalles de lo
que
estás haciendo.

En principio es una mala idea que el consumo de un web service esté
formando parte de una transacción. En la práctica, termina
convirtiendo a
tu transacción en una transacción larga. Esta siempre es
problemática para
los recursos del servidor d ebase de datos.

Deberías analizar si es posible consumir el WS fuera de la
transacción.


Gustavo Larriera, MVP
Solid Quality
MVP profile: http://aspnet2.com/mvp.ashx?GustavoLarriera
Blog: http://solidqualitylearning.com/blogs/glarriera/
Este mensaje se proporciona tal como es, sin garantías de ninguna clase
/
This message is provided "AS IS" with no warranties expressed or
implied,
and confers no rights.




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