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