Me enfrenta a un problema que me vuelve loco por un par de días, con la esperanza de que alguien me pueda ayudar. Aquí está;TransactionScope no se revierte dentro del método de servicio wcf, retrocede si se llama directamente
Estoy usando EF4 con la base de datos de Oracle, usando dotConnect for oracle de devart como proveedor. Tengo el método de servicio wcf que llama al método DeleteCabinet a continuación;
public void DeleteCabinet(string pRID)
{
using(TransactionScope tranScope = new TransactionScope())
{
DBUtils.DeleteCabinetAndShelves(pRecordId);
//throw exception to test record not deleted
throw new Exception("xxx something has happened test xxx");
tranScope.Complete();
}
}
DBUtils.DeleteCabinetAndShelves se refiere a continuación;
public void DeleteCabinetAndShelves(string pRecordId)
{
using(var context = new EdrmEntities())
{
var cabinet = context.Cabinets.Include("Shelves").Single(p => p.RID == pCabinetRID);
//mark all cabinet shelves for deletion
if (cabinet.Shelves != null)
{
foreach (var tempShelf in cabinet.Shelves.ToList())
{
context.DeleteObject(tempShelf);
}
}
//mark cabinet for deletion
context.DeleteObject(cabinet);
//save
context.SaveChanges();
}
}
cuando llamo DeleteCabinet de dentro de mi proyecto de prueba, no una llamada WCF pero el llamado método directo, funciona bien. Lanza una excepción y la transacción se retrotrae. Por lo tanto, no se elimina ningún registro de la base de datos como se esperaba
El problema es que cuando llamo al método de servicio (que llama a DeleteCabinet) desde un cliente, se lanza la excepción, pero el registro se borra de db. ¡La transacción no retrocede!
parece que llamar al método wcf no revierte la transacción, pero parece una locura (al menos para mí), ¿alguien sabe la razón por la que esto podría estar sucediendo?
Gracias de antemano
Creo que esto dependerá en gran medida de sus enlaces WCF y si tienen soporte transaccional. Actualice su pregunta para revelar sus enlaces y sus declaraciones de contrato de servicio WCF. – Rabid
Corrígeme si me equivoco, pero como mi servicio no está participando en una transacción iniciada por un cliente (ninguna transacción wcf en ese sentido), esas configuraciones deberían ser irrelevantes en este escenario. es decir: el método de llamada al servicio del cliente no se encuentra dentro de un workscope, es el servidor el que inicia y completa la transacción como se ve arriba. – rayback2
Ohh, ya veo, eso es extraño. ¿Le permite a WCF criticar el canal o maneja la excepción en la llamada de servicio WCF y envía un resultado al cliente? ¿'EdrmEntities' está construyendo su propia 'EntityConnection' o quizás está utilizando una conexión compartida que se enlistó automáticamente en una transacción implícita fuera de su' TransactionScope'? – Rabid