Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Sobre transacciones

Estas en el tema de Sobre transacciones en el foro de SQL Server en Foros del Web. Buenas... tengo unas dudas con respecto al manejo de transacciones. Tengo 2 procedimientos: Código: CREATE PROCEDURE proc1 as BEGIN TRAN INSERT INTO ... IF (@@error ...
  #1 (permalink)  
Antiguo 07/06/2007, 09:42
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años, 1 mes
Puntos: 47
Sobre transacciones

Buenas... tengo unas dudas con respecto al manejo de transacciones. Tengo 2 procedimientos:

Código:
CREATE PROCEDURE proc1
as

BEGIN TRAN

INSERT INTO ...
IF (@@error <> 0)
BEGIN
	ROLLBACK TRAN
	RETURN
END

INSERT INTO ...
IF (@@error <> 0)
BEGIN
	ROLLBACK TRAN
	RETURN
END

EXEC proc2
IF (@@error <> 0)
BEGIN
	ROLLBACK TRAN
	RETURN
END

COMMIT TRAN
END



CREATE PROCEDURE proc2
as

BEGIN TRAN

INSERT INTO ...
IF (@@error <> 0)
BEGIN
	ROLLBACK TRAN
	RETURN
END

COMMIT TRAN
END
Si no ocurre ningún error todo marcha bien. Pero sin en en la ultima línea del proc2 yo en vez de commit tran le pongo ROLLBACK TRAN y ejecuto el proc1 (que llama al proc2) entonces se me cae diciendo algo sobre que el commit tran no corresponde a ninguna transaccion

No entiendo bien como funciona esto de las transacciones. Yo tengo dos transacciones, si se hace rollback a la transacción del proc2 entonces me queda una transacción, que es la transacción del proc1, pero es como que si un rollback le haga rollback a todas las transacciones
  #2 (permalink)  
Antiguo 08/06/2007, 10:34
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Re: Sobre transacciones

segun recuerdo que esta pregunta ya la habias hecho antes...


Al parecer en tu segundo procedimiento estas dejando las transacciones abiertas...

y por eso al final te queda una pendiente...

debes revisar que esté pasando por el codigo donde se completa o se le da reversa...
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #3 (permalink)  
Antiguo 08/06/2007, 13:28
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años, 1 mes
Puntos: 47
Re: Sobre transacciones

Que tal. No estoy dejando una transacción abierta en el segundo procedimiento. ambos procedimientos tienen begin tran y commit tran o rollback tran en el caso de error.

Lo que yo digo es que si en el segundo procedimiento (que es llamado desde el primer procedimiento) en vez de hacer al final un commit tran le hago un rollback tran, al volver al primer procedimiento y hacer un commit tran me sale:

The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.
  #4 (permalink)  
Antiguo 14/06/2007, 12:36
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Re: Sobre transacciones

Lo leí en algún lugar, pero anidar transacciones entre SPs no es permitido. Desafortunadamente no encuentro la confirmación en la ayuda.

El rollback de tu transacción interna parece hacer rollback de todas las transacciones.

Prueba usando una sola transacción, para ver si aplica a los cambios dentro del SP anidado.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #5 (permalink)  
Antiguo 14/06/2007, 12:38
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Re: Sobre transacciones

Update:

Aunque en los BOL encuentro esto:
Cita:
SET QUOTED_IDENTIFIER OFF
GO
SET NOCOUNT OFF
GO
USE pubs
GO
CREATE TABLE TestTrans(Cola INT PRIMARY KEY,
Colb CHAR(3) NOT NULL)
GO
CREATE PROCEDURE TransProc @PriKey INT, @CharCol CHAR(3) AS
BEGIN TRANSACTION InProc
INSERT INTO TestTrans VALUES (@PriKey, @CharCol)
INSERT INTO TestTrans VALUES (@PriKey + 1, @CharCol)
COMMIT TRANSACTION InProc
GO
/* Start a transaction and execute TransProc */
BEGIN TRANSACTION OutOfProc
GO
EXEC TransProc 1, 'aaa'
GO
/* Roll back the outer transaction, this will
roll back TransProc's nested transaction */
ROLLBACK TRANSACTION OutOfProc
GO
EXECUTE TransProc 3,'bbb'
GO
/* The following SELECT statement shows only rows 3 and 4 are
still in the table. This indicates that the commit
of the inner transaction from the first EXECUTE statement of
TransProc was overridden by the subsequent rollback. */
SELECT * FROM TestTrans
GO
Revisa el tema "nested transactions" en los BOL
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #6 (permalink)  
Antiguo 14/06/2007, 16:10
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años, 1 mes
Puntos: 47
Re: Sobre transacciones

Probé algo sencillo, al hacer dos begin tran y luego un rollback y un commit

begin tran
begin tran
rollback tran
commit tran

me sale el error The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.
En el commit

La cosa es que por ejemplo yo hago un procedimiento con su respectivo begin y commit, digamos Ingresar Factura

Luego desde otro módulo me dicen que necesitan en su proceso ingresar varias facturas, que les de el nombre del proc al que tienen que llamar y una descripción de los parámetros. Entonces ellos usan mi procedimiento.

Entonces ellos hacen un procedimiento en el que hacen inserts en sus tablas y también llaman a mi procedimiento. Por lo que en su procedimiento crean una transaccion y cuando llaman al mio se crea otra transacción, pero el begin tran de mi procedimiento es algo que yo no puedo quitar porque yo también lo utilizo independientemente

Lo que toca hacer antes de hacer el commit final es hacer un select @@trancount y verificar si es mayor a cero. Si es así entonces hacer commit, rollback o lo que tocara en el caso

Yo pensaba que al hacer un rollback se le hace solo a una transacción, no a todas las transacciones
  #7 (permalink)  
Antiguo 24/06/2007, 20:13
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: Sobre transacciones

nombra a las transacciones independientemente, por que el motor no sabe que son dos, ya que todos los SP's se ejecutan bajo el mismo ambiente de ejecucion.
Si desde el SP1 haces un Begin Trans y desde el SP2 haces un RollBack o un Commit, SQL lo hará sobre la transaccion del SP1....

intenta algo como:
Código:
--desde el SP1
Begin trans T1
....

--Desde el SP2
Begin Trans T2
....
Commit Trans T2 ó Rollback Trans T2

--Regresando al SP1
Commit Trans T1 ó Rollback Trans T1
Me cuentas....

Saludos!
  #8 (permalink)  
Antiguo 25/06/2007, 11:02
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años, 1 mes
Puntos: 47
Re: Sobre transacciones

Hola chavo, si pongo

Código:
begin tran t1
begin tran t2
rollback tran t2
commit tran t1
me sale de error:

Msg 6401, Level 16, State 1, Line 3
Cannot roll back t2. No transaction or savepoint of that name was found.

En la linea 3
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:17.