È possibile utilizzare System.Transactions.TransactionScope con SqlBulkCopy?

.net sqlbulkcopy sql-server transactionscope

Domanda

Domanda molto semplice: è possibile utilizzare System.Transactions.TransactionScope insieme a SqlBulkCopy ? La documentazione Transaction e Bulk Copy Operations non menziona nulla (almeno a partire da .NET 4.0) e il mio test indica che non si integra automaticamente con TransactionScope .

Risposta popolare

SqlBulkCopy non si SqlBulkCopy mai in una transazione. SqlCommand non lo fa. Equivoco comune. L'allegato viene eseguito al momento in SqlConnection.Open viene chiamato SqlConnection.Open . Dopodiché, tutto ciò che viene eseguito su quella connessione è implicito nella transazione. In effetti non è più permesso passare una transazione esplicita.

Se si desidera che SqlBulkCopy partecipi a System.Transactions.Transaction utilizzando TransactionScope la transazione deve essere impostata nel momento in cui si apre la connessione.

È molto facile da fare:

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.
}

Questo codice è tutto ciò di cui hai bisogno. Possibili errori:

  1. La transazione deve essere aperta abbastanza presto.
  2. Non utilizzare lo SqlTransaction parametro SqlBulkCopy . Passa null .
  3. Non utilizzare SqlBulkCopyOptions.UseInternalTransaction .
  4. Non aggiungere la gestione delle eccezioni a meno che tu non voglia effettivamente fare qualcosa. Il rollback è automatico se non ci sono commit.
  5. Utilizzare l'istruzione using per il codice pulito e la pulizia deterministica. Non chiudere o smaltire manualmente nessuno di questi oggetti, a meno che non sia necessario. Questo sarebbe ridondante.

Puoi utilizzare qualsiasi dimensione di batch che ti piace e tutti i batch faranno parte della transazione. Pertanto, il batching ha un valore limitato (in particolare il log delle transazioni non può essere troncato in anticipo). Per prima cosa non provare a fare il batching.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow