X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FBlockRunner.pm;h=0a8ddeddcfbe08009bd35980e827e526b74d2012;hb=729656c504e5ca25cfebfbbbce69bb1e74268ef6;hp=be29701060422bfead3f5c361032a7471e4480b8;hpb=0020e364ef2847a723dd8bc538ee1ce632fd734c;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/BlockRunner.pm b/lib/DBIx/Class/Storage/BlockRunner.pm index be29701..0a8dded 100644 --- a/lib/DBIx/Class/Storage/BlockRunner.pm +++ b/lib/DBIx/Class/Storage/BlockRunner.pm @@ -136,9 +136,14 @@ sub _run { my @res = @_; my $storage = $self->storage; - my $cur_depth = $storage->transaction_depth; - if (defined $txn_init_depth and ! is_exception $run_err) { + if ( + defined $txn_init_depth + and + ! is_exception $run_err + and + defined( my $cur_depth = $storage->transaction_depth ) + ) { my $delta_txn = (1 + $txn_init_depth) - $cur_depth; if ($delta_txn) { @@ -158,22 +163,10 @@ sub _run { # something above threw an error (could be the begin, the code or the commit) if ( is_exception $run_err ) { - # attempt a rollback if we did begin in the first place - if ($txn_begin_ok) { - # some DBDs go crazy if there is nothing to roll back on, perform a soft-check - my $rollback_exception = $storage->_seems_connected - ? (! eval { $storage->txn_rollback; 1 }) ? $@ : '' - : 'lost connection to storage' - ; - - if ( $rollback_exception and ( - ! defined blessed $rollback_exception - or - ! $rollback_exception->isa('DBIx::Class::Storage::NESTED_ROLLBACK_EXCEPTION') - ) ) { - $run_err = "Transaction aborted: $run_err. Rollback failed: $rollback_exception"; - } - } + # Attempt a rollback if we did begin in the first place + # Will append rollback error if possible + $storage->__delicate_rollback( \$run_err ) + if $txn_begin_ok; push @{ $self->exception_stack }, $run_err;