From 5fcc3209c0a10ad732b3aeafa3fb79a6fd47ec7e Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Mon, 6 Oct 2025 13:28:08 +0200 Subject: [PATCH] Bug 26993: Use a txn --- Koha/Item.pm | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/Koha/Item.pm b/Koha/Item.pm index 37dec7fc552..8085a118bd8 100644 --- a/Koha/Item.pm +++ b/Koha/Item.pm @@ -971,28 +971,37 @@ sub last_returned_by { # Clean up the table by deleting older entries, depending on what StoreLastBorrower is set to my $max_stored_borrowers = C4::Context->preference('StoreLastBorrower') || 0; - # If StoreLastBorrower is 0 or disabled, bail without storing anything. Also delete any remaining rows from the table. - if ( $max_stored_borrowers == 0 ) { - $self->_result->last_returned_by->delete_all; - return $self; - } + my $schema = Koha::Database->new->schema; + $schema->txn_do( + sub { - #Create an entry for last_returned_by - my $new_record = $self->_result->create_related( - 'last_returned_by', - { borrowernumber => $borrowernumber, itemnumber => $self->itemnumber } - ); + # If StoreLastBorrower is 0 or disabled, bail without storing anything. Also delete any remaining rows from the table. + if ( $max_stored_borrowers == 0 ) { + $self->_result->last_returned_by->delete_all; + return $self; + } - # Get all entries, ordered by newest first - my @all_entries = - $self->_result->last_returned_by( {}, { order_by => [ { '-desc' => 'created_on' }, { '-desc' => 'id' } ] } ) - ->all; + # Create an entry for last_returned_by + my $new_record = $self->_result->create_related( + 'last_returned_by', + { borrowernumber => $borrowernumber, itemnumber => $self->itemnumber } + ); - # If we have more than the limit, delete the excess oldest ones - if ( scalar(@all_entries) > $max_stored_borrowers ) { - my @entries_to_delete = splice( @all_entries, $max_stored_borrowers ); - $_->delete for @entries_to_delete; - } + # Get all entries, ordered by newest first + my @all_entries = $self->_result->last_returned_by( + {}, + { + order_by => [ { '-desc' => 'created_on' }, { '-desc' => 'id' } ], + } + )->all; + + # If we have more than the limit, delete the excess oldest ones + if ( scalar(@all_entries) > $max_stored_borrowers ) { + my @entries_to_delete = splice( @all_entries, $max_stored_borrowers ); + $_->delete for @entries_to_delete; + } + } + ); return $self; } -- 2.34.1