none
Linq to sql y transacciones RRS feed

  • Pregunta

  • Hola a todos, tengo una duda que es mas filosofica que otra cosa. os cuento: en linq to sql contamos con la posibilidad de hacer transacciones facilmente. Por ejemplo con:

    DbTransaction trans = DataContext.Connection.BeginTransaction();

    El caso, es que con la folisofía de linq to sql no le encuentro utilidad a realizar transacciones de este modo... lo que quiero decir es lo siguiente: cuando yo tengo un formulario con inserciones, modificaciones y borrados lo hago todo sobre el mismo contexto y acabo haciendo un submitchanges, esto en sí mismo es una transaccion ya que o se ejecutan todas las operaciones o ninguna, entonces... ¿Para que iba a usar las transacciones anteriormente mencionadas?

    Podeis aclararmelo?? gracias

    viernes, 14 de diciembre de 2012 11:54

Respuestas

  • Con Linq, al hacer SubmitChanges sí que es cierto que se ejecuta dentro de una transacción, pero esta transacción sólo "empezará y acabará" en ese método si no existe otra pendiente.

    Imaginemos que hacemos un Insert de dos tablas a la vez; algo así como:

    Contexto.Coches.InsertOnSubmit(coche1);
    Contexto.Peliculas.InsertOnSubmit(peli1);
    Contexto.SubmitChanges();
    

    En este caso, al no existir ningún tipo de transacción, automáticamente creará una transacción, hará la inserción de coche1, hará la inserción de peli1 y sólo al final, si no existe error, ejecutará el Commit();

    Qué pasa cuando hacemos algo así como:

    using(TransactionScope ts = new TransactionScope())
    {
     Contexto.Coches.InsertOnSubmit(coche1);
     Contexto.SubmitChanges();
     Contexto.Peliculas.InsertOnSubmit(peli1);
     Contexto.SubmitChanges();
     ts.Complete();
    }

    Fíjate que no hago uso de la transacción del objeto Connection sino que uso la clase TransactionScope, que es la clase de .Net Framework para crear bloques de código transaccional. En este ejemplo, cuando se realiza el primer SubmitChanges "detecta" que existe una transacción y, al estar dentro de ella, no ejecutará ese SubmitChanges hasta que no encuentre el método Complete(), lo que habrá hecho que se ejecute ya el segundo SubmitChanges.

    Tienes más información al respecto en:

    http://msdn.microsoft.com/es-es/library/Bb386995(v=vs.100).aspx

    • Marcado como respuesta Peteiro lunes, 28 de enero de 2013 12:37
    sábado, 5 de enero de 2013 17:33

Todas las respuestas

  • Alguien que me pueda orientar?

    viernes, 21 de diciembre de 2012 14:11
  • Con Linq, al hacer SubmitChanges sí que es cierto que se ejecuta dentro de una transacción, pero esta transacción sólo "empezará y acabará" en ese método si no existe otra pendiente.

    Imaginemos que hacemos un Insert de dos tablas a la vez; algo así como:

    Contexto.Coches.InsertOnSubmit(coche1);
    Contexto.Peliculas.InsertOnSubmit(peli1);
    Contexto.SubmitChanges();
    

    En este caso, al no existir ningún tipo de transacción, automáticamente creará una transacción, hará la inserción de coche1, hará la inserción de peli1 y sólo al final, si no existe error, ejecutará el Commit();

    Qué pasa cuando hacemos algo así como:

    using(TransactionScope ts = new TransactionScope())
    {
     Contexto.Coches.InsertOnSubmit(coche1);
     Contexto.SubmitChanges();
     Contexto.Peliculas.InsertOnSubmit(peli1);
     Contexto.SubmitChanges();
     ts.Complete();
    }

    Fíjate que no hago uso de la transacción del objeto Connection sino que uso la clase TransactionScope, que es la clase de .Net Framework para crear bloques de código transaccional. En este ejemplo, cuando se realiza el primer SubmitChanges "detecta" que existe una transacción y, al estar dentro de ella, no ejecutará ese SubmitChanges hasta que no encuentre el método Complete(), lo que habrá hecho que se ejecute ya el segundo SubmitChanges.

    Tienes más información al respecto en:

    http://msdn.microsoft.com/es-es/library/Bb386995(v=vs.100).aspx

    • Marcado como respuesta Peteiro lunes, 28 de enero de 2013 12:37
    sábado, 5 de enero de 2013 17:33