none
Problema con transacciones en WCF RRS feed

  • Pregunta

  • A continuación expongo mi código WCF, tanto del servidor, la intefez y el cliente a ver que estoy haciendo mal y porque no me funciona correctamente el TransactionScope:

     


    Mi servicio:

    public class ServiceCoreFactory : IServiceCoreFactory {

    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    public ServiceCoreFactory() {
    }

    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    public void metodo1() {
    }

    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    public void metodo2() {
    }

    }

    Mi interfaz:

    [ServiceContract()]
    [ServiceKnownType(typeof(Company))]
    [ServiceKnownType(typeof(User))]

    public interface IServiceCoreFactory : IDisposable {

    [OperationContract]
    [TransactionFlow(TransactionFlowOption.Mandatory)]
    void metodo1();

    [OperationContract]
    [TransactionFlow(TransactionFlowOption.Mandatory)]
    void metodo2();

    }

    Mi cliente:

    using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
    {
    try
    {

    proxy.metodo1();
    throw new Exception("Rollback!");
    proxy.metodo2();
    ts.Complete();

    }
    catch (Exception ex)
    {

    ts.Dispose();

    }

    }

    NUNCA se ejecuta el Rollback en la base de datos.
    Alguna idea?

    Muchas gracias.

     

    miércoles, 15 de septiembre de 2010 14:46

Todas las respuestas

  • No aclaré que el método1 y el método2 lo que hacen es escribir un registro en la base de datos. La conexión a la base de datos se abre y se cierra en el mismo método.

    Gracias.

    jueves, 16 de septiembre de 2010 17:58
  • asegurate de usar wshttpbinding
    pk el basichttpbinding no soporta transaciones

    Ejemplo de Transacción:

    En el servicio:

    [ServiceContract(SessionMode = SessionMode.Required)]
    [BindingRequirements(TransactionFlowRequirements = RequirementsMode.Required)]
    public interface IClienteManager
    {
    [OperationContract()]
    [TransactionFlow(TransactionFlowOption.Allowed)]
    List<Cliente> DameClientes();
    [OperationContract()]
    [TransactionFlow(TransactionFlowOption.Allowed)]
    void ModificarCliente(int id, string nuevoNombre, string nuevoApellido);
    [OperationContract()]
    Cliente BuscarCliente(int id);
    }
    [ServiceBehavior(TransactionIsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted,
    InstanceContextMode = InstanceContextMode.Single)]
    public class ClienteManager : IClienteManager
    {
    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    public void ModificarCliente(int id, string nuevoNombre, string nuevoApellido)
    {
    ...
    }
    }

    En el cliente:

    Try
    {
    using (TransactionScope tx = new TransactionScope(TransactionScopeOption.Required))
    {
    //código de la transacción
    tx.Complete();
    }
    }
    catch(Exception e)
    {
    Console.WriteLine("ERROR: {0}", e.Message);
    }
     



    si algo no entiendes me avisas para explicartelo :P
    martes, 21 de septiembre de 2010 18:26