Pregunta muy simple: ¿es posible usar System.Transactions.TransactionScope
junto con SqlBulkCopy
? La documentación Transaction and Bulk Copy Operations no menciona nada (al menos a partir de .NET 4.0) y mis pruebas indican que no se alista automáticamente con TransactionScope
.¿Es posible usar System.Transactions.TransactionScope con SqlBulkCopy?
Respuesta
La única forma de definir la transacción en una carga masiva (que yo sepa) es especificar el tamaño del lote.
La ventaja de la carga masiva es que obtiene un bloqueo de actualización masiva (lectura de subprocesos múltiples y escritura de subprocesos múltiples). Usted obtiene esto cuando usa bcp, inserción masiva, una tarea de flujo de datos ssis con (tablock), un inserto (columnas) selecciona columnas de openrowset (bulk), o un sqlbulkcopy. Esto es útil cuando se trata de minimizar el tiempo de carga y el tamaño del registro de transacciones (solo si ha cumplido con los requisitos mínimamente registrados, lo que le ahorrará horas en millones de filas).
Cada vez que carga datos, el registro de transacciones será el cuello de botella. Si el tiempo es esencial, es importante minimizar la cantidad que se registra.
Una vez que se cumple el tamaño del lote (el número de filas que usted especificó para comprometer) la transacción se compromete y comienza de nuevo. Si especifica un tamaño de lote de 0, la transacción cubrirá el archivo completo y la reversión si surge algún problema de datos.
Eso es desafortunado. Tengo confirmaciones de una sola fila y cargas masivas en * tablas * múltiples seguidas de una actualización de una fila en otra tabla que tienen que tener éxito o ninguna tiene éxito. Esperaba que fuera fácil de lograr envolver los commits y las cargas masivas y la actualización final en un 'TransactionScope'. Tendré que tomar un enfoque diferente. Gracias por la respuesta detallada, muy apreciada. – jason
Para realizar importaciones atómicas de SqlBulkCopy que abarquen todos los lotes (y, opcionalmente, a través de otras declaraciones de base de datos), necesitamos usar transacciones. Los pasos siguientes describen el proceso de uso de una transacción con SqlBulkCopy:
- Cree una conexión Sql al servidor de la base de datos de destino.
- Abra la conexión.
- Crea un objeto SqlTransaction.
- Crea el objeto SqlBulkCopy que pasa en el objeto SqlTransaction en el constructor.
- Realice la importación - la llamada a WriteToServer - dentro de un Try ... Catch block. Si la operación se completa, confirme la transacción; si falla, arrástralo hacia atrás.
¿Qué tenemos dos bases de datos involucradas? –
Esta respuesta no explica TransactionScope que se le preguntó. – usr
SqlBulkCopy
nunca se alista en una transacción. SqlCommand
tampoco hace eso. Malentendido común. El alistamiento se realiza en el momento en que se llama al SqlConnection.Open
. Después de eso, todo lo que se ejecuta en esa conexión es parte de la transacción implícitamente. De hecho, ya no es permitido para pasar una transacción explícita.
Si quiere SqlBulkCopy
para tomar parte en un System.Transactions.Transaction
utilizando TransactionScope
, la transacción debe establecerse en el momento de abrir 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 necesita. Posibles errores:
- La transacción se debe abrir lo suficientemente temprano.
- No utilice el parámetro
SqlTransaction
deSqlBulkCopy
. Pasenull
. - No utilice
SqlBulkCopyOptions.UseInternalTransaction
. - No agregue el manejo de excepciones a menos que desee realmente hacer algo. La reversión es automática si no hay commit.
- Utilice la declaración
using
para el código limpio y la limpieza determinista. No cierre ni deseche manualmente ninguno de estos objetos a menos que sea necesario. Esto sería redundante.
Puede usar cualquier tamaño de lote que desee y todos los lotes será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). Intenta no hacer un lote al principio.
forma adicional se puede utilizar para minimizar el tiempo de bloqueo en la vida real
use SqlBulkCopy and copy data to temporary table use delete output construction to move data into production table
- 1. C# - System.Transactions.TransactionScope
- 2. ¿es posible usar Eigen con c?
- 3. ¿Es posible usar Django con Qooxdoo framework?
- 4. ¿Es posible usar "bigint" condicionalmente con Perl?
- 5. ¿Es posible usar vim con el mouse
- 6. ¿Es posible usar "instaladores exe" con pip?
- 7. ¿Es posible usar cin con Qt?
- 8. ¿Es posible usar app_offline con Azure Websites?
- 9. ¿Cuál es el inconveniente de SqlBulkCopy
- 10. Inserción masiva paralela con SqlBulkCopy y Azure
- 11. SqlBulkCopy y Entity Framework
- 12. ¿Cómo funciona SqlBulkCopy?
- 13. Tiempo de espera caducado con SqlBulkCopy
- 14. SqlBulkCopy Not Working
- 15. SQLBulkCopy o inserción masiva
- 16. ¿Es posible usar NGen con la implementación ClickOnce?
- 17. ¿Es posible usar std :: accumulate con std :: min?
- 18. ¿Es posible usar POD (documentación antigua simple) con Python?
- 19. ¿Es posible usar acumuladores de refuerzo con vectores?
- 20. ¿Es posible usar COUNT con una proyección DISTINCT JPA?
- 21. ¿Es posible usar curl con ruta relativa en PHP?
- 22. ¿Es posible usar mysqli_fetch_object con una instrucción preparada?
- 23. ¿Es posible usar una biblioteca C con Python AppEngine?
- 24. ¿Es posible usar boost :: foreach con std :: map?
- 25. ¿Es posible usar la cláusula SELECT INTO con UNION [ALL]?
- 26. ¿Es posible usar la biblioteca OpenMP con Android NDK?
- 27. ¿Es posible usar Mozilla Persona (BrowserID) con aplicaciones móviles?
- 28. ¿Es posible usar Boost.Format con un búfer preasignado?
- 29. ¿Es posible usar js2-mode como modo javascript con nxhtml?
- 30. ¿Es posible usar Ropemacs con TRAMP en Emacs?
Aquí es algunas respuestas acerca TransactionScope que puede ser útil para su situación http://stackoverflow.com/q/2884863/463478 –