2010-03-31 34 views
6

Trabajar con SQL/ADO, me hizo pensar en algo que, lógicamente, debería incluirse con .NET Framework, y me preguntaba si eso existe, déjenme explicarlo..net, ¿obtiene un objeto de transacción?

Hay un objeto que es esencialmente un administrador de transacciones, que pasa comandos (elementos de trabajo) a y al mismo me imagino que también sería necesario pasar las acciones de reversión para cada elemento de trabajo en la transacción.

Por ejemplo

digamos que quería realizar las siguientes acciones:

  1. crear una carpeta
  2. Cree un archivo en esta carpeta
  3. realizar algunas otras tareas misceláneas como llaves reg edición , o realmente se puede pensar en acción que se puede revertir.

Ahora, en el caso de que algo falle, necesito implementar manualmente una estrategia de retrotracción, ¿así que quizás exista una forma de gestionar estos elementos de trabajo como una transacción utilizando la funcionalidad de OOB .NET?

Considero que sería mucho pedir que los artículos se reviertan automáticamente, pero tener la capacidad de controlar manualmente lo que sucede durante una reversión por elemento de trabajo, parece práctico.

Otra cosa es lo que Microsoft ha hecho con LINQ es realmente genial, teniendo efectivamente consultas tipo SQL para todo tipo de cosas, no solo para tablas SQL. Entonces, ¿tal vez hay algún modelo de transacción con LINQ?

Gracias, si conoce algo como esto?

Respuesta

0

Normalmente, las transacciones en este sentido implican DB IO y no operaciones del sistema de archivos. En ADO.Net 2.0, harías algo como el siguiente código.

Para otros tipos de transacciones, sugiero buscar en el MS DTC (Coordinador de transacciones distribuidas). Esto permitirá que sus transacciones abarquen diferentes máquinas, y también creo que eso le permite alistar acciones personalizadas para que se retrotraigan.

Espero que esto ayude.

using (SqlConnection connection = 
      new SqlConnection(connectionString)) 
{ 
    SqlCommand command = connection.CreateCommand(); 
    SqlTransaction transaction = null; 

    try 
    { 
     // BeginTransaction() Requires Open Connection 
     connection.Open(); 

     transaction = connection.BeginTransaction(); 

     // Assign Transaction to Command 
     command.Transaction = transaction; 

     // Execute 1st Command 
     command.CommandText = "Insert ..."; 
     command.ExecuteNonQuery(); 

     // Execute 2nd Command 
     command.CommandText = "Update..."; 
     command.ExecuteNonQuery(); 

     transaction.Commit(); 
    } 
    catch 
    { 
     transaction.Rollback(); 
     throw; 
    } 
    finally 
    { 
     connection.Close(); 
    } 
} 
5

Usted puede utilizar la clase TransactionScope iniciar una transacción, pero cualquier acción que realice dentro de esa transacción tiene que ser "conscientes de transacción" y saber cómo compensar si la transacción se revierte.

Brent VanderMeide hizo una serie de dos partes en dnrTV sobre cómo escribir clases que conocen acerca de TransactionScope. Aquí está part 1, y aquí está part 2.

+0

Esto parece muy prometedor, parece que no solo se limita a las bases de datos ¿verdad? –

+0

No es que yo sepa, no. Mira los videos: las clases que Brent escribe no están relacionadas con db IIRC. –

+0

Los ámbitos de transacción son geniales porque puede colocar el código .net que no ha escrito dentro de su transacción. –

Cuestiones relacionadas