Problemas con transacciones

08/04/2005 - 19:25 por Jaimito | Informe spam
Hola compañeros...

Que pena con ustedes pero se me olvidó colocar algunos instrucciones en el
proyecto 2.

Tengo una aplicación que me está generando el siguiente error:
Distributed transaction completed. Either enlist this session in a new
transaction or the NULL transaction

Explicaré y resumiré lo que mas pueda, como funciona mi proyecto.

Tengo 3 proyectos:

*********************************************************
Proyecto 1 -> Creador de Contextos Transaccionales

Esta es una clase llamada ContextCreator y su código es algo así:
*********************************************************
[assembly:ApplicationActivation(ActivationOption.Library)]

[Transaction(TransactionOption.RequiresNew)]
[JustInTimeActivation(True)]
public Class ContextCreator : ServicedComponent
{
// mi transacción
ITransaction myTran;

// en el constructor obtengo el contexto transaccional y lo guardo
// en mi variable myTran;
public ContextCreator()
{
myTran = (ITransaction) ContextUtil.Transaction;
}

// una simple propiedad para retornar la transacción
public ITransaction Transaction
{
get { return myTran; }
}

// algunos métodos que solo enmascaran el llamado a otros métodos
// del objeto ContextUtil
public void Commit() {ContextUtil.SetComplete();}
public void DisableCommit() {ContextUtil.DisableCommit();}
public void EnabledCommit() {ContextUtil.EnableCommit();}
public void Rollback() {ContextUtil.SetAbort();}
}


*********************************************************
Proyecto 2 -> Aplicación que hace uso del proyecto 1 y trabaja con una BD

Enseguida explico cómo hago uso del proyecto 1
*********************************************************

// declaro e instancio un objeto creador de transacciones
ContextCreator myCtx = new ContextCreator();

// Con un objeto SqlConnection, previamente instanciado, abierto y todo
// sus juguetes bien configurados; invoco al método
EnlistDistributedTransaction
// y le paso como parámetro la propiedad Transaction del objeto ContextCreator
// creado en la sentencia anterior.
// AQUÍ CORREGÍ
myConnection.EnlistDistributedTransaction(myCtx.Transaction)

// luego con un objeto SqlCommand ejecuto una SQL cualquiera, así:
SqlCommand myComm = myConnection.CreateCommand();
myComm.CommandText = "INSERT INTO myTable VALUES(..)";

// aquí, esta instrucción se ejecuta a veces sin problemas y a veces arroja
// la excepción que les mostré arriba
myComm.ExecuteNonQuery();

// confirmo transacciones
myCtx.Commit()

¿Qué puede ser?
¿Tengo alguna configuración errada, o atributo en mi clase "ContextCreator"?
¿Omití algo?

Adicionalmente, les comento que:

1) El componente que contiene a la clase ContextCreator, está firmado
digitalmente y lo registro en el MTS con la herramienta regsvcs. Esto se hace
sin problema alguno.

2) Tengo SQL Server 2000, .net framework 1.1 y vs.2003

Les agradezco toda su colaboración.

Gracias...
 

Leer las respuestas

#1 Miguel Angel Campos
10/04/2005 - 11:46 | Informe spam
No he analizado a fondo lo que estas haciendo, pero tengo preguntas y
afirmaciones con lo que he visto.
¿Estas en un entorno cliente/servidor? (Aunque me imagino que si)
¿El componente del Proyecto 2 donde lo instancias, en el cliente o en el
servidor?
¿Por que no dejas de utilizar la clase ContextCreator, y le pones los
atributos a las clases del proyecto 2, añadiendo el atributo AutoComplete
que hace de forma automatica lo que estas haciendo tu de forma manual?
Un Saludo,

Miguel Angel Campos,
MCAD.NET

"Jaimito" escribió en el mensaje
news:
Hola compañeros...

Que pena con ustedes pero se me olvidó colocar algunos instrucciones en el
proyecto 2.

Tengo una aplicación que me está generando el siguiente error:

Distributed transaction completed. Either enlist this session in a new
transaction or the NULL transaction


Explicaré y resumiré lo que mas pueda, como funciona mi proyecto.

Tengo 3 proyectos:

*********************************************************
Proyecto 1 -> Creador de Contextos Transaccionales

Esta es una clase llamada ContextCreator y su código es algo así:
*********************************************************
[assembly:ApplicationActivation(ActivationOption.Library)]

[Transaction(TransactionOption.RequiresNew)]
[JustInTimeActivation(True)]
public Class ContextCreator : ServicedComponent
{
// mi transacción
ITransaction myTran;

// en el constructor obtengo el contexto transaccional y lo guardo
// en mi variable myTran;
public ContextCreator()
{
myTran = (ITransaction) ContextUtil.Transaction;
}

// una simple propiedad para retornar la transacción
public ITransaction Transaction
{
get { return myTran; }
}

// algunos métodos que solo enmascaran el llamado a otros métodos
// del objeto ContextUtil
public void Commit() {ContextUtil.SetComplete();}
public void DisableCommit() {ContextUtil.DisableCommit();}
public void EnabledCommit() {ContextUtil.EnableCommit();}
public void Rollback() {ContextUtil.SetAbort();}
}


*********************************************************
Proyecto 2 -> Aplicación que hace uso del proyecto 1 y trabaja con una BD

Enseguida explico cómo hago uso del proyecto 1
*********************************************************

// declaro e instancio un objeto creador de transacciones
ContextCreator myCtx = new ContextCreator();

// Con un objeto SqlConnection, previamente instanciado, abierto y todo
// sus juguetes bien configurados; invoco al método
EnlistDistributedTransaction
// y le paso como parámetro la propiedad Transaction del objeto


ContextCreator
// creado en la sentencia anterior.
// AQUÍ CORREGÍ
myConnection.EnlistDistributedTransaction(myCtx.Transaction)

// luego con un objeto SqlCommand ejecuto una SQL cualquiera, así:
SqlCommand myComm = myConnection.CreateCommand();
myComm.CommandText = "INSERT INTO myTable VALUES(..)";

// aquí, esta instrucción se ejecuta a veces sin problemas y a veces


arroja
// la excepción que les mostré arriba
myComm.ExecuteNonQuery();

// confirmo transacciones
myCtx.Commit()

¿Qué puede ser?
¿Tengo alguna configuración errada, o atributo en mi clase


"ContextCreator"?
¿Omití algo?

Adicionalmente, les comento que:

1) El componente que contiene a la clase ContextCreator, está firmado
digitalmente y lo registro en el MTS con la herramienta regsvcs. Esto se


hace
sin problema alguno.

2) Tengo SQL Server 2000, .net framework 1.1 y vs.2003

Les agradezco toda su colaboración.

Gracias...

Preguntas similares