To make sure we will not never get a race conditions for these kinds of
notices, we need to add a LOCK on the message_queue table.
This does not smell the best way to do that, but I faced deadlock issues
when I tried to use "UPDATE FOR"
https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html
https://dev.mysql.com/doc/refman/5.7/en/lock-tables.html
https://dev.mysql.com/doc/refman/5.7/en/commit.html
To test this patch, or another solution, you need to apply manually this
change:
my $message = C4::Message->find_last_message($borrower, $type, $mtt);
unless ( $message ) {
+ sleep(1);
C4::Message->enqueue($letter, $borrower, $mtt);
} else {
And repeat the test plan from first patch.
Do not forget to truncate the message_queue table.
Followed test plans, works as expected.
Signed-off-by: Marc VĂ©ron <veron@veron.ch>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Brendan A Gallagher <brendan@bywatersolutions.com>
(cherry picked from commit
be156d9ad9e5bcfadab34d44f90e04fd61e256ad)
Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>
(cherry picked from commit
ab23d1368343ad115a5072f7264b99c7bee68675)
Signed-off-by: Julian Maurice <julian.maurice@biblibre.com>
});
my $issues_table = ( $type eq 'CHECKOUT' || $type eq 'RENEWAL' ) ? 'issues' : 'old_issues';
+ my $schema = Koha::Database->new->schema;
my @transports = keys %{ $borrower_preferences->{transports} };
for my $mtt (@transports) {
my $letter = C4::Letters::GetPreparedLetter (
}
) or next;
+ $schema->storage->txn_begin;
+ C4::Context->dbh->do(q|LOCK TABLE message_queue READ|);
+ C4::Context->dbh->do(q|LOCK TABLE message_queue WRITE|);
my $message = C4::Message->find_last_message($borrower, $type, $mtt);
unless ( $message ) {
+ C4::Context->dbh->do(q|UNLOCK TABLES|);
C4::Message->enqueue($letter, $borrower, $mtt);
} else {
$message->append($letter);
$message->update;
}
+ C4::Context->dbh->do(q|UNLOCK TABLES|);
+ $schema->storage->txn_commit;
}
return;