¿Es posible usar System.Transactions.TransactionScope con SqlBulkCopy?

.net sqlbulkcopy sql-server transactionscope

Pregunta

Pregunta muy simple: ¿es posible usar System.Transactions.TransactionScope junto con SqlBulkCopy ? La documentación Operaciones de transacciones y copias masivas no menciona nada (al menos a partir de .NET 4.0) y mi prueba indica que no se inscribe automáticamente con TransactionScope .

Respuesta popular

SqlBulkCopy nunca se SqlBulkCopy en una transacción. SqlCommand tampoco hace eso. Malentendido común. El alistamiento se realiza en el momento en que se llama a SqlConnection.Open . Después de eso, todo lo que se ejecuta en esa conexión es parte implícita de la transacción. De hecho ya no está permitido pasar una transacción explícita.

Si desea que SqlBulkCopy participe en un System.Transactions.Transaction utilizando TransactionScope la transacción debe establecerse en el momento en que abra la conexión.

Es muy fácil de hacer:

using (var tran = new TransactionScope(...))
using (var conn = new SqlConnection(connStr))
{
  conn.Open(); //This enlists.

  using (var sqlBulkCopy = new SqlBulkCopy(conn)) {
    sqlBulkCopy.WriteToServer(...);
  }

  tran.Complete(); //Commit.
}

Este código es todo lo que necesitas. Posibles errores:

  1. La transacción debe abrirse con suficiente antelación.
  2. No utilice el SqlTransaction parámetro de SqlBulkCopy . Pase null .
  3. No utilice SqlBulkCopyOptions.UseInternalTransaction .
  4. No agregue el manejo de excepciones a menos que realmente desee hacer algo. La reversión es automática si no hay confirmación.
  5. Utilice la declaración de using para el código limpio y la limpieza determinista. No cierre ni deseche ninguno de estos objetos manualmente a menos que tenga que hacerlo. Esto sería redundante.

Puede usar cualquier tamaño de lote que desee y todos los lotes formarán parte de la transacción. Por lo tanto, el procesamiento por lotes tiene un valor limitado (en particular, el registro de transacciones no se puede truncar antes). Trate de no hacer lotes en absoluto primero.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué