Bug 32990: Prevent deadlock in _update_batch_record_counts

Resolves:
C4::ImportBatch::_update_batch_record_counts(): DBI Exception: DBD::mysql::st execute failed: Deadlock found when trying to get lock; try restarting transaction at /usr/share/koha/C4/ImportBatch.pm line 392

See also bug 32558.

Test plan:
If you apply 32558 first, run multiple processes that stage a marc import.
Without this patch, you can trigger the deadlock.
With this patch, it works.

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
This commit is contained in:
Marcel de Rooy 2023-02-17 08:33:41 +00:00 committed by Tomas Cohen Arazi
parent 2504a282b5
commit 9a6d10dc31
Signed by: tomascohen
GPG key ID: 0A272EA1B2F3C15F

View file

@ -1724,21 +1724,24 @@ sub _update_batch_record_counts {
my ($batch_id) = @_;
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare_cached("UPDATE import_batches SET
num_records = (
my ( $num_records ) = $dbh->selectrow_array(q|
SELECT COUNT(*)
FROM import_records
WHERE import_batch_id = import_batches.import_batch_id),
num_items = (
WHERE import_batch_id = ?
|, undef, $batch_id );
my ( $num_items ) = $dbh->selectrow_array(q|
SELECT COUNT(*)
FROM import_records
JOIN import_items USING (import_record_id)
WHERE import_batch_id = import_batches.import_batch_id
AND record_type = 'biblio')
WHERE import_batch_id = ?");
$sth->bind_param(1, $batch_id);
$sth->execute();
$sth->finish();
WHERE import_batch_id = ? AND record_type = 'biblio'
|, undef, $batch_id );
$dbh->do(
"UPDATE import_batches SET num_records=?, num_items=? WHERE import_batch_id=?",
undef,
$num_records,
$num_items,
$batch_id,
);
}
sub _get_commit_action {