Payment-Helfer: with_transaction() anstelle von do_transaction() nutzen
authorMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 15 Aug 2016 14:42:59 +0000 (16:42 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 15 Aug 2016 14:42:59 +0000 (16:42 +0200)
commit58d092116ce5b3134c10df44697c2ce760f0a294
treea387e65e56f00561873f6d8bd569ff8fecaa8e8b
parentc6af9711e167b2bba757e337bca50861e60d34f5
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.
SL/DB/Helper/Payment.pm