Skip to content

Commit 130dedb

Browse files
ACPT-757: Fix Deadlock in Magento\UrlRewrite\Model\Storage\DbStorage
moving non-database logic to before transaction to reduce lock time
1 parent 7c63371 commit 130dedb

File tree

1 file changed

+8
-8
lines changed

1 file changed

+8
-8
lines changed

app/code/Magento/UrlRewrite/Model/Storage/DbStorage.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -213,16 +213,15 @@ private function prepareUrlRewrite(string $requestPath, array $urlRewrite): arra
213213
/**
214214
* Delete old URLs from DB.
215215
*
216-
* @param UrlRewrite[] $urls
216+
* @param array $uniqueEntities
217217
* @return void
218218
*/
219-
private function deleteOldUrls(array $urls): void
219+
private function deleteOldUrls(array $uniqueEntities): void
220220
{
221221
$oldUrlsSelect = $this->connection->select();
222222
$oldUrlsSelect->from(
223223
$this->resource->getTableName(self::TABLE_NAME)
224224
);
225-
$uniqueEntities = $this->prepareUniqueEntities($urls);
226225
foreach ($uniqueEntities as $storeId => $entityTypes) {
227226
foreach ($entityTypes as $entityType => $entities) {
228227
$oldUrlsSelect->orWhere(
@@ -271,14 +270,15 @@ private function prepareUniqueEntities(array $urls): array
271270
*/
272271
protected function doReplace(array $urls): array
273272
{
273+
$uniqueEntities = $this->prepareUniqueEntities($urls);
274+
$data = [];
275+
foreach ($urls as $url) {
276+
$data[] = $url->toArray();
277+
}
274278
for ($tries = 0; $tries < $this->maxRetryCount; $tries++) {
275279
$this->connection->beginTransaction();
276280
try {
277-
$this->deleteOldUrls($urls);
278-
$data = [];
279-
foreach ($urls as $url) {
280-
$data[] = $url->toArray();
281-
}
281+
$this->deleteOldUrls($uniqueEntities);
282282
$this->upsertMultiple($data);
283283
$this->connection->commit();
284284
} catch (\Magento\Framework\DB\Adapter\DeadlockException $deadlockException) {

0 commit comments

Comments
 (0)