From 58d092116ce5b3134c10df44697c2ce760f0a294 Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Mon, 15 Aug 2016 16:42:59 +0200 Subject: [PATCH] Payment-Helfer: with_transaction() anstelle von do_transaction() nutzen MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit »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. --- SL/DB/Helper/Payment.pm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/SL/DB/Helper/Payment.pm b/SL/DB/Helper/Payment.pm index 3d97be0f6..b7bf38a12 100644 --- a/SL/DB/Helper/Payment.pm +++ b/SL/DB/Helper/Payment.pm @@ -119,7 +119,7 @@ sub pay_invoice { my $fx_gain_loss_amount = 0; # for fx_gain and fx_loss my $db = $self->db; - $db->do_transaction(sub { + $db->with_transaction(sub { my $new_acc_trans; # all three payment type create 1 AR/AP booking (the paid part) @@ -304,11 +304,13 @@ sub pay_invoice { $datev->export; if ($datev->errors) { - # this exception should be caught by do_transaction, which handles the rollback + # this exception should be caught by with_transaction, which handles the rollback die join "\n", $::locale->text('DATEV check returned errors:'), $datev->errors; } } + 1; + }) || die t8('error while paying invoice #1 : ', $self->invnumber) . $db->error . "\n"; return 1; -- 2.20.1