Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 58d09211

Von Moritz Bunkus vor mehr als 8 Jahren hinzugefügt

  • ID 58d092116ce5b3134c10df44697c2ce760f0a294
  • Vorgänger c6af9711
  • Nachfolger 66d468b0

Payment-Helfer: with_transaction() anstelle von do_transaction() nutzen

»do_transaction()« kommt von Rose::DB selber. Es schert sich nicht
darum, ob bereits eine Transaktion läuft, sondern macht einfach eine mit
»BEGIN« auf. Am Ende der an »do_transaction()« übergebenen Sub committet
sie dann (oder macht einen Rollback).

Problematisch ist das dann, wenn in dem Moment bereits eine Transaktion
läuft und man eigentlich möchte, dass sowohl die externen Änderungen als
auch die von »pay_invoice()« durchgeführten Änderungen alle ganz oder
alle gar nicht committet werden. Genau das bietet
»SL::DB::with_transaction()«, das nur dann eine neue Transkation
startet, falls noch keine läuft, und den Code ansonsten direkt ausführt.

Anders als »do_transaction()« wertet »with_transaction()« den
Rückgabewert der übergebenen Sub aus. Ist dieser im Perl-Sinne false, so
wird ein Rollback durchgeführt — nicht nur bei einer Ausnahme. Daher
muss in diesem Fall unsere übergebene Sub zusätzlich einen wahren
Wert (hier: »1«) zurückgeben, um Erfolg zu signalisieren.

Unterschiede anzeigen:

SL/DB/Helper/Payment.pm
119 119
  my $fx_gain_loss_amount = 0; # for fx_gain and fx_loss
120 120

  
121 121
  my $db = $self->db;
122
  $db->do_transaction(sub {
122
  $db->with_transaction(sub {
123 123
    my $new_acc_trans;
124 124

  
125 125
    # all three payment type create 1 AR/AP booking (the paid part)
......
304 304
      $datev->export;
305 305

  
306 306
      if ($datev->errors) {
307
        # this exception should be caught by do_transaction, which handles the rollback
307
        # this exception should be caught by with_transaction, which handles the rollback
308 308
        die join "\n", $::locale->text('DATEV check returned errors:'), $datev->errors;
309 309
      }
310 310
    }
311 311

  
312
    1;
313

  
312 314
  }) || die t8('error while paying invoice #1 : ', $self->invnumber) . $db->error . "\n";
313 315

  
314 316
  return 1;

Auch abrufbar als: Unified diff