Duda sobre transacciones.

09/02/2005 - 13:25 por JOSE ANTONIO | Informe spam
Hola, tengo una duda respecto a las transacciones de sql server.

BEGIN TRANSACTION
DECLARE @NUMERO INT,@SUMAR INT
SET @SUMAR' // este numero cambia en cada llamada
SELECT @NUMERO=MAX(NUMERO)+@SUMAR FROM TABLANUMEROS
SELECT .. un select que tarde unas veces mas y
otras menos dependiendo de los paramatetros.
INSERT TABLANUMEROS @NUMERO y el resultado del select anterior
COMMIT TRANSACCION

durante este proceso puede ser que otro usuario llame al mismo procedimiento
con el @SUMAR', si el procedimiento primero no ha terminado todavia, es
decir todavia no ha iniciado la insercion en TABLANUMEROS, y los calculos
intermedios de la segunda llamada se terminan antes que la primera llamada
con lo cual se insertan antes,sql server intentara insertar un @NUMERO que
ya esta en la tabla procedente de la segunda llamada, con lo que fallara y
dara un error de duplicacion de clave.

Esto es asi o estoy equivocado?.


Saludos.

Preguntas similare

Leer las respuestas

#1 Maxi
09/02/2005 - 13:46 | Informe spam
Hola, es correcto, pero si queres resolver este problema te paso un articulo
que escribi hace un tiempo ;)

http://www.microsoft.com/spanish/ms...art187.asp


Salu2
Maxi


"JOSE ANTONIO" escribió en el mensaje
news:
Hola, tengo una duda respecto a las transacciones de sql server.

BEGIN TRANSACTION
DECLARE @NUMERO INT,@SUMAR INT
SET @SUMAR' // este numero cambia en cada llamada
SELECT @NUMERO=MAX(NUMERO)+@SUMAR FROM TABLANUMEROS
SELECT .. un select que tarde unas veces mas y
otras menos dependiendo de los paramatetros.
INSERT TABLANUMEROS @NUMERO y el resultado del select anterior
COMMIT TRANSACCION

durante este proceso puede ser que otro usuario llame al mismo
procedimiento con el @SUMAR', si el procedimiento primero no ha
terminado todavia, es decir todavia no ha iniciado la insercion en
TABLANUMEROS, y los calculos intermedios de la segunda llamada se terminan
antes que la primera llamada con lo cual se insertan antes,sql server
intentara insertar un @NUMERO que ya esta en la tabla procedente de la
segunda llamada, con lo que fallara y dara un error de duplicacion de
clave.

Esto es asi o estoy equivocado?.


Saludos.


Respuesta Responder a este mensaje
#2 Tinoco
09/02/2005 - 13:47 | Informe spam
Hola jose,

Hola Jose,

Segun tu ejemplo, SI puede suceder este inconveniente. Una solucion es
utilizar el Select interno con Bloqueo de lineas, para evitar que otro
usuario pueda utilizar los mismos recursos.

Hermilson Tinoco
Colombia

"JOSE ANTONIO" wrote:

Hola, tengo una duda respecto a las transacciones de sql server.

BEGIN TRANSACTION
DECLARE @NUMERO INT,@SUMAR INT
SET @SUMAR' // este numero cambia en cada llamada
SELECT @NUMERO=MAX(NUMERO)+@SUMAR FROM TABLANUMEROS
SELECT .. un select que tarde unas veces mas y
otras menos dependiendo de los paramatetros.
INSERT TABLANUMEROS @NUMERO y el resultado del select anterior
COMMIT TRANSACCION

durante este proceso puede ser que otro usuario llame al mismo procedimiento
con el @SUMAR', si el procedimiento primero no ha terminado todavia, es
decir todavia no ha iniciado la insercion en TABLANUMEROS, y los calculos
intermedios de la segunda llamada se terminan antes que la primera llamada
con lo cual se insertan antes,sql server intentara insertar un @NUMERO que
ya esta en la tabla procedente de la segunda llamada, con lo que fallara y
dara un error de duplicacion de clave.

Esto es asi o estoy equivocado?.


Saludos.



Respuesta Responder a este mensaje
#3 qwalgrande
09/02/2005 - 13:49 | Informe spam
Hola.

Lo que dices es del todo correcto.

qwalgrande

"JOSE ANTONIO" wrote:

Hola, tengo una duda respecto a las transacciones de sql server.

BEGIN TRANSACTION
DECLARE @NUMERO INT,@SUMAR INT
SET @SUMAR' // este numero cambia en cada llamada
SELECT @NUMERO=MAX(NUMERO)+@SUMAR FROM TABLANUMEROS
SELECT .. un select que tarde unas veces mas y
otras menos dependiendo de los paramatetros.
INSERT TABLANUMEROS @NUMERO y el resultado del select anterior
COMMIT TRANSACCION

durante este proceso puede ser que otro usuario llame al mismo procedimiento
con el @SUMAR', si el procedimiento primero no ha terminado todavia, es
decir todavia no ha iniciado la insercion en TABLANUMEROS, y los calculos
intermedios de la segunda llamada se terminan antes que la primera llamada
con lo cual se insertan antes,sql server intentara insertar un @NUMERO que
ya esta en la tabla procedente de la segunda llamada, con lo que fallara y
dara un error de duplicacion de clave.

Esto es asi o estoy equivocado?.


Saludos.



Respuesta Responder a este mensaje
#4 JOSE ANTONIO
09/02/2005 - 14:31 | Informe spam
Maxi, en tu articulo, muy explicito por cierto, indicas que al comenzar una
transaccion y realizar un update en la tabla numeradora nadia podra realizar
un update en esta tabla.
¿Como lo hace?
Esperando a que termine esta transaccion o devolviendole un error al usuario
que accede en segundo lugar.

Significa esto que sql server espera en la instruccion update hasta qie
termine la transaccion y despues sigue con el procedimiento?

Saludos
"Maxi" escribió en el mensaje
news:%23%
Hola, es correcto, pero si queres resolver este problema te paso un
articulo que escribi hace un tiempo ;)

http://www.microsoft.com/spanish/ms...art187.asp


Salu2
Maxi


"JOSE ANTONIO" escribió en el mensaje
news:
Hola, tengo una duda respecto a las transacciones de sql server.

BEGIN TRANSACTION
DECLARE @NUMERO INT,@SUMAR INT
SET @SUMAR' // este numero cambia en cada llamada
SELECT @NUMERO=MAX(NUMERO)+@SUMAR FROM TABLANUMEROS
SELECT .. un select que tarde unas veces mas
y otras menos dependiendo de los paramatetros.
INSERT TABLANUMEROS @NUMERO y el resultado del select anterior
COMMIT TRANSACCION

durante este proceso puede ser que otro usuario llame al mismo
procedimiento con el @SUMAR', si el procedimiento primero no ha
terminado todavia, es decir todavia no ha iniciado la insercion en
TABLANUMEROS, y los calculos intermedios de la segunda llamada se
terminan antes que la primera llamada con lo cual se insertan antes,sql
server intentara insertar un @NUMERO que ya esta en la tabla procedente
de la segunda llamada, con lo que fallara y dara un error de duplicacion
de clave.

Esto es asi o estoy equivocado?.


Saludos.






Respuesta Responder a este mensaje
#5 Maxi
09/02/2005 - 16:52 | Informe spam
Hola, sqlserver espera al desbloqueo, es totalmente transparente para el
usuario


Salu2
Maxi


"JOSE ANTONIO" escribió en el mensaje
news:
Maxi, en tu articulo, muy explicito por cierto, indicas que al comenzar
una transaccion y realizar un update en la tabla numeradora nadia podra
realizar un update en esta tabla.
¿Como lo hace?
Esperando a que termine esta transaccion o devolviendole un error al
usuario que accede en segundo lugar.

Significa esto que sql server espera en la instruccion update hasta qie
termine la transaccion y despues sigue con el procedimiento?

Saludos
"Maxi" escribió en el mensaje
news:%23%
Hola, es correcto, pero si queres resolver este problema te paso un
articulo que escribi hace un tiempo ;)

http://www.microsoft.com/spanish/ms...art187.asp


Salu2
Maxi


"JOSE ANTONIO" escribió en el mensaje
news:
Hola, tengo una duda respecto a las transacciones de sql server.

BEGIN TRANSACTION
DECLARE @NUMERO INT,@SUMAR INT
SET @SUMAR' // este numero cambia en cada llamada
SELECT @NUMERO=MAX(NUMERO)+@SUMAR FROM TABLANUMEROS
SELECT .. un select que tarde unas veces mas
y otras menos dependiendo de los paramatetros.
INSERT TABLANUMEROS @NUMERO y el resultado del select anterior
COMMIT TRANSACCION

durante este proceso puede ser que otro usuario llame al mismo
procedimiento con el @SUMAR', si el procedimiento primero no ha
terminado todavia, es decir todavia no ha iniciado la insercion en
TABLANUMEROS, y los calculos intermedios de la segunda llamada se
terminan antes que la primera llamada con lo cual se insertan antes,sql
server intentara insertar un @NUMERO que ya esta en la tabla procedente
de la segunda llamada, con lo que fallara y dara un error de duplicacion
de clave.

Esto es asi o estoy equivocado?.


Saludos.










email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida