Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

326
Visualizações
¿Cómo inscribirse con un TransactionScope?

Version corta

¿Cómo me inscribo en un TransactionScope en curso?

Versión larga

Si usa un TransactionScope , puede crear una transacción "ambiental" :

 using (TransactionScope scope = new TransactionScope()) { //...stuff happens, then you complete... // The Complete method commits the transaction. scope.Complete(); }

¿Para qué sirve eso? Bueno, hay algunas clases en el marco .NET que saben cómo verificar si hay una transacción ambiental en curso al verificar la static :

  • Sistema.Transacciones.Actuales

Esto les permite saber que hay una transacción en curso.

Por ejemplo, si tuviera alguna operación de base de datos arbitraria que de otro modo no consideraría las transacciones:

 void DropStudents() { using (var cmd = connection.CreateCommand()) { cmd.CommandText = "DROP TABLE Students;"; cmd.ExecuteNonQuery(); } }

Si coloca eso en medio de un TransactionScope :

 using (TransactionScope scope = new TransactionScope()) { DropStudents(); // The Complete method commits the transaction. scope.Complete(); }

De repente, sus operaciones de ADO.net están en una transacción; y se puede revertir.

Inicio de transacción, compromiso y reversión automáticos

La biblioteca SqlClient sabe verificar:

  • Sistema.Transacciones.Actuales

y automáticamente internamente:

  • Comenzar una transacción de base de datos
  • Confirme la transacción de la base de datos cuando llame a Scope.Complete
  • Revertir la transacción de la base de datos cuando se revierte el alcance

Y todo es pura magia.

  • de alguna manera DbConnection recibe una notificación para llamar a .Commit
  • y de alguna manera DbConnection recibe una notificación para llamar a .Rollback

¿Cómo puedo hacer eso?

Tengo una clase que también tiene transacciones. Y en lugar de obligar a la persona que llama a llamar:

 using (IContosoTransaction tx = turboEncabulator.BeginTransaction()) { try { turboEncabulator.UpendCardinalGrammeters(); } catch (Exception ex) { tx.Rollback(); throw; } tx.Commit(); }

Sería bueno si pudieran llamar a:

 turboEncabulator.UpendCardinalGrammeters();

Y mi código simplemente verificará:

  • Sistema.Transacciones.Actuales

Y si hay una transacción en curso, lo haré:

  • comenzar una transacción
  • espere la notificación para confirmar
  • o espere la notificación para revertir

Pero, ¿cómo hago eso?

¿Cómo me registro en un TransactionScope en curso para recibir estas notificaciones?

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

No es tan malo en realidad.

  1. Compruebe si hay una transacción en curso al ver si System.Transactions.Transaction.Current está asignado. Si lo hay, Enlist en la transacción:

     //Enlist in any current transactionScope if one is active if (System.Transactions.Transaction.Current != null) System.Transactions.Transaction.Current.EnlistVolatile(this, EnlistmentOptions.None);
  2. Y luego debe implementar los cuatro métodos de notificación de IEnlistmentNotification :

    • void Prepare(PreparingEnlistment preparingEnlistment);
    • void Commit(Enlistment enlistment);
    • void InDoubt(Enlistment enlistment);
    • void Rollback(Enlistment enlistment);

Las implementaciones reales son notificaciones repetitivas triviales:

  • Preparar : el administrador de transacciones solicita su voto sobre si la transacción es buena para ser comprometida:
    • Para votar Sí : preparingEnlistment.Prepared();
    • Para votar No : preparingEnlistment.ForceRollback();
  • Comprometerse : Haga sus cosas para comprometerse y declarar que ha terminado con su alistamiento:
    • enlistment.Done();
  • InDoubt : notificación de que el administrador de la transacción perdió la comunicación con otra persona involucrada en la transacción. Responda haciéndoles saber que ha terminado con el alistamiento:
    • enlistment.Done();
  • Rollback : Notificación de que la transacción se está revirtiendo. Realice cualquier tipo de trabajo de reversión y hágales saber que ha terminado con el alistamiento:
    • enlistment.Done();

O más completamente

 public void Prepare(PreparingEnlistment preparingEnlistment) { //The transaction manager is asking for our vote if the transaction //can be committed //Vote "yes" by calling .Prepared: preparingenlistment.Prepared(); //Vote "no" by calling .ForceRollback: //preparingEnlistment.ForceRollback(); } public void Commit(Enlistment enlistment) { //The transaction is being committed - do whatever it is we do to commit. //Let them know we're done with the enlistment. enlistment.Done(); } public void InDoubt(Enlistment enlistment) { //Do any work necessary when indoubt notification is received. //This method is called if the transaction manager loses contact with one or more participants, //so their status is unknown. //If this occurs, you should log this fact so that you can investigate later whether any of the //transaction participants has been left in an inconsistent state. //Let them know we're done with the enlistment. enlistment.Done(); } public void Rollback(Enlistment enlistment) { //If any resource manager reported a failure to prepare in phase 1, the transaction manager invokes //the Rollback method for each resource manager and indicates to the application the failure of the commit. //Let them know we're done with the enlistment. enlistment.Done(); }
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda