La Transaccion bloquea una SELECT

15/06/2005 - 14:07 por Cesar | Informe spam
Tengo el siguiente problema y no me cuadra con lo que leo en la ayuda del SQL
Server 2000.
Hago el siguiente proceso en mi aplicacion:
1.- Me conecto la servidor con ADO.
2.- Inicio una transaccion.
3.- Ejecuto un insert en la TABLA 1.

Desde este mismo momento la TABLA 1 queda bloqueada completamente, y no
puedo hacer SELECT de ella, ni desde otras aplicaciones, ni desde el
Administrador Corporativo, ni desde en Analizador de consultas. Sólo se
libera cuando realizo el commit del transaccion.

Esta es la configuración de la conexión que estoy usando:
mObjADOConexion.CommandTimeout = iTimeOutProceso
mObjADOConexion.ConnectionString = pStrConexion
mObjADOConexion.ConnectionTimeout = iTimeOutConexion
mObjADOConexion.CursorLocation = adUseClient
mObjADOConexion.Properties("Prompt").Value = adPromptNever
Y he probado con casi todos los IsolationLevel.

¿Es normal esto en SQL Server 2000?.
Yo pensaba que la SELECT debería funcionar aunque no me apareciera el
registro insertado en la transacción, ya que aún no he realizado el commit.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
15/06/2005 - 15:01 | Informe spam
Cesar,

Esa tabla tiene primary key?
Cuanto tiempo estas manteniendo esa transaccion abierta?
Dices que probastes con casi todos los niveles de IsolationLevel, donde
seteastes el nivel en la conexion o en el batch que ejecutas en sql server?.


AMB

"Cesar" wrote:

Tengo el siguiente problema y no me cuadra con lo que leo en la ayuda del SQL
Server 2000.
Hago el siguiente proceso en mi aplicacion:
1.- Me conecto la servidor con ADO.
2.- Inicio una transaccion.
3.- Ejecuto un insert en la TABLA 1.

Desde este mismo momento la TABLA 1 queda bloqueada completamente, y no
puedo hacer SELECT de ella, ni desde otras aplicaciones, ni desde el
Administrador Corporativo, ni desde en Analizador de consultas. Sólo se
libera cuando realizo el commit del transaccion.

Esta es la configuración de la conexión que estoy usando:
mObjADOConexion.CommandTimeout = iTimeOutProceso
mObjADOConexion.ConnectionString = pStrConexion
mObjADOConexion.ConnectionTimeout = iTimeOutConexion
mObjADOConexion.CursorLocation = adUseClient
mObjADOConexion.Properties("Prompt").Value = adPromptNever
Y he probado con casi todos los IsolationLevel.

¿Es normal esto en SQL Server 2000?.
Yo pensaba que la SELECT debería funcionar aunque no me apareciera el
registro insertado en la transacción, ya que aún no he realizado el commit.
Respuesta Responder a este mensaje
#2 Don Roque
15/06/2005 - 18:16 | Informe spam
Probaste haciendo el select con "nolock"?
Respuesta Responder a este mensaje
#3 Hermes
16/06/2005 - 18:07 | Informe spam
"Alejandro Mesa" wrote:

Cesar,

Esa tabla tiene primary key?



Sí Tiene una primary key, que es un Autonumérico.

Cuanto tiempo estas manteniendo esa transaccion abierta?



En realidad, esta transacción dura unos 30 segundos, aunque podría
rediseñarla para que tardase menos. Aún así, no entiendo como un INSERT de un
registro en una tabla dentro de una transacción puede bloquear la tabla
entera para IMPEDIR hacer SELECT sobre ella. La tabla tiene ahora sólo 3
registros, con el INSERT quiero añadir el cuarto ¿Puede esto influir?.


Dices que probastes con casi todos los niveles de IsolationLevel, donde
seteastes el nivel en la conexion o en el batch que ejecutas en sql server?.



Lo añadí al código de Visual Basic, justo debajo de las otras lineas que
setean las propiedades de la conexión, por ejemplo:
mObjADOConexion.IsolationLevel = adXactCursorStability

Estoy muy agradecido por tu interés.
Muchas Gracias




AMB

"Cesar" wrote:

> Tengo el siguiente problema y no me cuadra con lo que leo en la ayuda del SQL
> Server 2000.
> Hago el siguiente proceso en mi aplicacion:
> 1.- Me conecto la servidor con ADO.
> 2.- Inicio una transaccion.
> 3.- Ejecuto un insert en la TABLA 1.
>
> Desde este mismo momento la TABLA 1 queda bloqueada completamente, y no
> puedo hacer SELECT de ella, ni desde otras aplicaciones, ni desde el
> Administrador Corporativo, ni desde en Analizador de consultas. Sólo se
> libera cuando realizo el commit del transaccion.
>
> Esta es la configuración de la conexión que estoy usando:
> mObjADOConexion.CommandTimeout = iTimeOutProceso
> mObjADOConexion.ConnectionString = pStrConexion
> mObjADOConexion.ConnectionTimeout = iTimeOutConexion
> mObjADOConexion.CursorLocation = adUseClient
> mObjADOConexion.Properties("Prompt").Value = adPromptNever
> Y he probado con casi todos los IsolationLevel.
>
> ¿Es normal esto en SQL Server 2000?.
> Yo pensaba que la SELECT debería funcionar aunque no me apareciera el
> registro insertado en la transacción, ya que aún no he realizado el commit.
Respuesta Responder a este mensaje
#4 Hermes
16/06/2005 - 18:08 | Informe spam
"Don Roque" wrote:

Probaste haciendo el select con "nolock"?





Sí lo he probado y la tabla sigue bloqueada, de todas formas, es la orden
INSERT de un registro en la tabla la que la deja bloqueada por completo para
SELECT simultáneos.
Respuesta Responder a este mensaje
#5 Hermes
16/06/2005 - 19:55 | Informe spam
"Don Roque" wrote:

Probaste haciendo el select con "nolock"?




Tengo como clave primaria un autonumerico.

Los niveles de ISOLATION LEVEL los he asignado desde código visual basic y
tambien desde el Administrador de consultas. He probado con todos, y ninguno
soluciona el problema.

Tambien he probado el (NOLOCK) y no funciona. Lo raro es que si hago un
INSERT de un registro en una tabla dentro de una transacción, ¿Por qué me
bloquea toda la tabla para realizar SELECT?.

He encontrado una manera de poder hacer la select y evitar el bloqueo y es
añadiendo el WITH (READPAST) a las clausulas FROM de todas las ordenes SELECT
SQL de mis aplicaciones. Pero ¿No puedo definir este parámetro por defecto a
nivel de conexion, base de datos o servidor?

Muchas Gracias Por vuestra ayuda.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida