Bloqueo base de datos

Hola si me puedes ayudar te lo agradecería.
Tengo una transacción en una base de datos de sql server 2005, la cual puede procesar hasta 400 0 500 pedidos, cada que la mando me bloquea todo el sistema no me deja ni loguear en la ampliación desde otra estación hasta que esta termina. Como puedo aislar la transacción y que el resto de usuarios no se vean afectados. Gracias

2 respuestas

Respuesta
1
Más allá de tu modelo de datos, que si puedes darme la información de que cantidad de tablas tiene y el volumen de datos que maneja sería de mucha ayuda.
¿Cuál es la instrucción que estas ejecutando? Si podrías mostrármela, podemos ver que no haya algún problema de performancia.
En cuanto al servidor ¿Estás ejecutando tu transacción localmente o por medio de una red?
¿Los otros usuarios están accediendo a la base de datos de igual manera?
Me encantaría ayudarte con tu problema
Todo esta dentro de una transacción que hace commit o rollback
El sp principal recorre los pedidos por medio de un cursor, este sp llama variaos sp hijos los cuales ejecutan varias acciones y validaciones, y esto lo hace pedido por pedido. Se le envían desde 500 a 1000 pedidos y cada pedido se demora en procesar aproximadamente 2 o 3 segundos.
Una de las soluciones que puedes llegar a utilizar en SQL Server 2005, es:
ALTER DATABASE ... SET ALLOW_SNAPSHOT_ISOLATION ON
Dicho comando permitirá tratar, desde el momento que lo ejecutes, a las transacciones como Snapshots de los datos que tengas sin confirmar en la transacción.
No genera errores de concurrencia, que es lo que te debe estar pasando con algunas tablas involucradas en en tu sp y que son utilizadas para el loguin.
No permite un dirty read, generado de leer datos sin confirmar por un commit.
Si deseas mantener permanentemente ésta carácteristica utiliza éste comando:
ALTER DATABASE ... SET READ_COMMITTED_SNAPSHOT ON
"El modo de aislamiento Snapshot mantiene las versiones de los cambios en la base de datos tempdb para cada transacción, cuando una transacción toma datos, los mismos poseen asociado un numero de versión, para que la confirmación tenga éxito es requisito que los datos a modificar no posean un número de versión mayor al que posee la transacción. Si una transacción intenta confirmar datos con una versión de cambios anterior a la actual, la operación fallará"
Te aclaro que no probé ésta solución ya que sería preferible revisar el SP y encerrar en transacciones la mínima cantidad de datos posibles para evitar timeouts.
Espero que te sea de utilidad, no estoy seguro de poder enviarte algunos links por aquí para otras fuentes, pero creó que resultó algo interesante aquí.
Esa solución ya la probé, igualmente me sigue bloqueando la aplicación, incluso se apodera de las tablas de logueo que igualmente no tienen nada que ver con el proceso, no se por donde más mirar.
OK, solo me puedo imaginar el SP principal que se ejecuta por pedido, pero...
El Begin transaction y commit, contiene todas las iteraciones del cursor, ¿o solo para la sección de código que incluye la modificación del pedido actual?
Mi idea es que tal vez lleves el begin y commit a la menor parte de código posible.
Tampoco estoy al tanto del hardware en el que estas trabajando, ¿pero puede llegar a ocasionar un problema de accesos por tráfico de información de tu sp? ¿Y es por eso que los usuarios reciben el bloqueo? ¿Qué tipo de error recibís al momento de loguearte desde otra terminal?
Ayudame a eliminar posibles inconvenientes.
Respuesta
-1
¿Ok me podrías mandar el SP que estás utilizando?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas