Problema extraño con transacciones

13/06/2006 - 13:54 por solusoft | Informe spam
Hola,

llevaba varias semanas tras un error, inexplicable para mi, relacionado con
transacciones.

El caso es que tenía una aplicación Windows Forms .NET en C# y SQL SERVER
2000 . En un formulario inicio una transacción, realizo una serie de select e
inserts -que son indiferentes para aceptar o cancelar la transacción-, y
acepto transacción.

La cuestión es que si falla por ejemplo un insert dentro de la transacción,
al hacer el commit, me da un error:

La petición COMMIT TRANSACTION no tiene la correspondiente BEGIN TRANSACTION
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION

En el analizador de consultas hago:

begin tran

select * from CORC_TEMP_COMPROMISOS where it_accion = 'M'
select @@trancount

select * from CORC_TEMP_COMPROMISOS where it_accion = 'A'
select @@trancount

Insert into CORC_COMPROMISOS (cd_linea_financiera, cd_asociacion,
cd_accion, nm_grupos, nm_participantes)
values ( '5','0001',33,33,33) -- falla por triggers , es indiferente para el
commit/rollbak de la transacción
select @@trancount -- aqui vale 0 !!!!!!!!!! DEBERIA VALER 1 !!!!!

commit tran


El caso es que al fallar cualquier consulta (select, insert...) dentro de la
transacción, justo después el trancount me vale 0, y debería valer 1.

Alguién sabe cómo pu edo solucionarlo ? Es posbile que sea configuración de
SQL SERVER ??

Saludos cordiales y gracias anticipadas.

Preguntas similare

Leer las respuestas

#1 Vyacheslav Popov
13/06/2006 - 14:30 | Informe spam
Hola,

Sospecho que esto debe a lo siguiente: cuando se produce el error en la
instrucción INSERT se ejecuta automáticamente la instrucción ROLLBACK si
después le pides hacer COMMIT no encuentra ninguna entrada en la cola de
transacciones.

La solución es, comprobar si se ha producido algún error con algo así (if
@@error = 0) no estoy seguro... entonces ejecutar COMMIT.

Saludos.

"solusoft" escribió en el mensaje
news:
Hola,

llevaba varias semanas tras un error, inexplicable para mi, relacionado
con
transacciones.

El caso es que tenía una aplicación Windows Forms .NET en C# y SQL SERVER
2000 . En un formulario inicio una transacción, realizo una serie de
select e
inserts -que son indiferentes para aceptar o cancelar la transacción-, y
acepto transacción.

La cuestión es que si falla por ejemplo un insert dentro de la
transacción,
al hacer el commit, me da un error:

La petición COMMIT TRANSACTION no tiene la correspondiente BEGIN
TRANSACTION
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION

En el analizador de consultas hago:

begin tran

select * from CORC_TEMP_COMPROMISOS where it_accion = 'M'
select @@trancount

select * from CORC_TEMP_COMPROMISOS where it_accion = 'A'
select @@trancount

Insert into CORC_COMPROMISOS (cd_linea_financiera, cd_asociacion,
cd_accion, nm_grupos, nm_participantes)
values ( '5','0001',33,33,33) -- falla por triggers , es indiferente para
el
commit/rollbak de la transacción
select @@trancount -- aqui vale 0 !!!!!!!!!! DEBERIA VALER 1 !!!!!

commit tran


El caso es que al fallar cualquier consulta (select, insert...) dentro de
la
transacción, justo después el trancount me vale 0, y debería valer 1.

Alguién sabe cómo pu edo solucionarlo ? Es posbile que sea configuración
de
SQL SERVER ??

Saludos cordiales y gracias anticipadas.




Respuesta Responder a este mensaje
#2 solusoft
13/06/2006 - 16:08 | Informe spam
Sí, la cuestión es que quisiera que aunque falle la sentencia no se haga el
rollback automáticamente, sino que sea cuestión del programador hacer el
commit o el rollback, y este creo que es el comportamiento por defecto.

Saludos a todos.

"Vyacheslav Popov" escribió:

Hola,

Sospecho que esto debe a lo siguiente: cuando se produce el error en la
instrucción INSERT se ejecuta automáticamente la instrucción ROLLBACK si
después le pides hacer COMMIT no encuentra ninguna entrada en la cola de
transacciones.

La solución es, comprobar si se ha producido algún error con algo así (if
@@error = 0) no estoy seguro... entonces ejecutar COMMIT.

Saludos.

"solusoft" escribió en el mensaje
news:
> Hola,
>
> llevaba varias semanas tras un error, inexplicable para mi, relacionado
> con
> transacciones.
>
> El caso es que tenía una aplicación Windows Forms .NET en C# y SQL SERVER
> 2000 . En un formulario inicio una transacción, realizo una serie de
> select e
> inserts -que son indiferentes para aceptar o cancelar la transacción-, y
> acepto transacción.
>
> La cuestión es que si falla por ejemplo un insert dentro de la
> transacción,
> al hacer el commit, me da un error:
>
> La petición COMMIT TRANSACTION no tiene la correspondiente BEGIN
> TRANSACTION
> The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION
>
> En el analizador de consultas hago:
>
> begin tran
>
> select * from CORC_TEMP_COMPROMISOS where it_accion = 'M'
> select @@trancount
>
> select * from CORC_TEMP_COMPROMISOS where it_accion = 'A'
> select @@trancount
>
> Insert into CORC_COMPROMISOS (cd_linea_financiera, cd_asociacion,
> cd_accion, nm_grupos, nm_participantes)
> values ( '5','0001',33,33,33) -- falla por triggers , es indiferente para
> el
> commit/rollbak de la transacción
> select @@trancount -- aqui vale 0 !!!!!!!!!! DEBERIA VALER 1 !!!!!
>
> commit tran
>
>
> El caso es que al fallar cualquier consulta (select, insert...) dentro de
> la
> transacción, justo después el trancount me vale 0, y debería valer 1.
>
> Alguién sabe cómo pu edo solucionarlo ? Es posbile que sea configuración
> de
> SQL SERVER ??
>
> Saludos cordiales y gracias anticipadas.
>
>
>
>



Respuesta Responder a este mensaje
#3 Vyacheslav Popov
13/06/2006 - 17:21 | Informe spam
Hola, he encontrado algo en el manual...

Es responsabilidad del programador de Transact-SQL utilizar COMMIT
TRANSACTION sólo en el punto donde todos los datos a los que hace referencia
la transacción sean lógicamente correctos.

Si la transacción que se ha confirmado era una transacción Transact-SQL
distribuida, COMMIT TRANSACTION hace que MS DTC utilice el protocolo de
confirmación en dos fases para enviar confirmaciones a los servidores
involucrados en la transacción. Si una transacción local afecta a dos o más
bases de datos del mismo servidor, SQL Server utiliza una confirmación
interna en dos fases para confirmar todas las bases de datos involucradas en
la transacción.

Cuando se utiliza en transacciones anidadas, las confirmaciones de las
transacciones anidadas no liberan recursos ni hacen permanentes sus
modificaciones. Las modificaciones sobre los datos sólo quedan permanentes y
se liberan los recursos cuando se confirma la transacción más externa. Cada
COMMIT TRANSACTION que se ejecute cuando @@TRANCOUNT sea mayor que 1 sólo
reduce @@TRANCOUNT en 1. Cuando @@TRANCOUNT llega a 0, se confirma la
transacción externa entera. Como SQL Server omite transaction_name, la
ejecución de una instrucción COMMIT TRANSACTION que haga referencia al
nombre de una transacción externa cuando haya transacciones anidadas
pendientes sólo reduce @@TRANCOUNT en 1.

La ejecución de COMMIT TRANSACTION cuando @@TRANCOUNT es 0 produce un error
que indica que no hay ninguna instrucción BEGIN TRANSACTION asociada.

No se puede cancelar una transacción después de ejecutar una instrucción
COMMIT TRANSACTION, porque las modificaciones sobre los datos ya son parte
permanente de la base de datos.



Este ejemplo utiliza @@TRANCOUNT para comprobar si hay transacciones
abiertas que haya que confirmar.

BEGIN TRANSACTION
UPDATE authors SET au_lname = upper(au_lname)
WHERE au_lname = 'White'
IF @@ROWCOUNT = 2
COMMIT TRAN

IF @@TRANCOUNT > 0
BEGIN
PRINT 'A transaction needs to be rolled back'
ROLLBACK TRAN
END


Espero que te sirva.
"solusoft" escribió en el mensaje
news:
Sí, la cuestión es que quisiera que aunque falle la sentencia no se haga
el
rollback automáticamente, sino que sea cuestión del programador hacer el
commit o el rollback, y este creo que es el comportamiento por defecto.

Saludos a todos.

"Vyacheslav Popov" escribió:

Hola,

Sospecho que esto debe a lo siguiente: cuando se produce el error en la
instrucción INSERT se ejecuta automáticamente la instrucción ROLLBACK si
después le pides hacer COMMIT no encuentra ninguna entrada en la cola de
transacciones.

La solución es, comprobar si se ha producido algún error con algo así (if
@@error = 0) no estoy seguro... entonces ejecutar COMMIT.

Saludos.

"solusoft" escribió en el mensaje
news:
> Hola,
>
> llevaba varias semanas tras un error, inexplicable para mi, relacionado
> con
> transacciones.
>
> El caso es que tenía una aplicación Windows Forms .NET en C# y SQL
> SERVER
> 2000 . En un formulario inicio una transacción, realizo una serie de
> select e
> inserts -que son indiferentes para aceptar o cancelar la transacción-,
> y
> acepto transacción.
>
> La cuestión es que si falla por ejemplo un insert dentro de la
> transacción,
> al hacer el commit, me da un error:
>
> La petición COMMIT TRANSACTION no tiene la correspondiente BEGIN
> TRANSACTION
> The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION
>
> En el analizador de consultas hago:
>
> begin tran
>
> select * from CORC_TEMP_COMPROMISOS where it_accion = 'M'
> select @@trancount
>
> select * from CORC_TEMP_COMPROMISOS where it_accion = 'A'
> select @@trancount
>
> Insert into CORC_COMPROMISOS (cd_linea_financiera, cd_asociacion,
> cd_accion, nm_grupos, nm_participantes)
> values ( '5','0001',33,33,33) -- falla por triggers , es indiferente
> para
> el
> commit/rollbak de la transacción
> select @@trancount -- aqui vale 0 !!!!!!!!!! DEBERIA VALER 1 !!!!!
>
> commit tran
>
>
> El caso es que al fallar cualquier consulta (select, insert...) dentro
> de
> la
> transacción, justo después el trancount me vale 0, y debería valer 1.
>
> Alguién sabe cómo pu edo solucionarlo ? Es posbile que sea
> configuración
> de
> SQL SERVER ??
>
> Saludos cordiales y gracias anticipadas.
>
>
>
>



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