Try to put Recommendation job components into transactions to see if can stop DB locking, a=chris
Try to put Recommendation job components into transactions to see if can stop DB locking, a=chris
diff --git a/src/library/media_jobs/RecommendationJob.php b/src/library/media_jobs/RecommendationJob.php
index d45e67cc6..5d62cad8d 100644
--- a/src/library/media_jobs/RecommendationJob.php
+++ b/src/library/media_jobs/RecommendationJob.php
@@ -1282,6 +1282,7 @@ class RecommendationJob extends MediaJob
$db = $this->db;
$term_embedding = $this->lru_cache->get($term_id);
if (!isset($term_embedding)) {
+ $db->beginTransaction();
$sql = "SELECT VECTOR FROM RECOMMENDATION_TERM_EMBEDDING " .
"WHERE ITEM_TYPE = ? AND ID = ? " . $db->limitOffset(1);
$result = $db->execute($sql, [$item_type, $term_id]);
@@ -1296,6 +1297,7 @@ class RecommendationJob extends MediaJob
$db->closeCursor($result);
$term_embedding = base64_decode($row['VECTOR'], true);
}
+ $db->commit();
}
if ($update) {
$this->updateTermEmbeddingCache($term_id, $term_embedding,
@@ -1321,12 +1323,14 @@ class RecommendationJob extends MediaJob
$on_conflict = in_array($db->to_upper_dbms, ["MYSQL"]) ?
" ON DUPLICATE KEY " :
" ON CONFLICT (ITEM_TYPE, ID) DO UPDATE ";
+ $db->beginTransaction();
$sql = "INSERT INTO RECOMMENDATION_TERM_EMBEDDING VALUES ".
"(?, ?, ?) $on_conflict SET VECTOR = ?";
$vector = base64_encode($evicted_item[1]);
$db->pre_message = "$message {$evicted_item[0]} was evicted";
$db->execute($sql, [$evicted_item[0], $item_type,
$vector, $vector]);
+ $db->commit();
}
}
/**
diff --git a/src/models/datasources/DatasourceManager.php b/src/models/datasources/DatasourceManager.php
index 4bc128dab..308ed510a 100755
--- a/src/models/datasources/DatasourceManager.php
+++ b/src/models/datasources/DatasourceManager.php
@@ -120,10 +120,18 @@ abstract class DatasourceManager
* associative array in the form column_name => value
*/
abstract public function fetchArray($result);
+ /**
+ *
+ */
+ abstract public function beginTransaction();
/**
*
*/
abstract public function closeCursor($result);
+ /**
+ *
+ */
+ abstract public function commit();
/**
* Used to escape strings before insertion in the
* database to avoid SQL injection
diff --git a/src/models/datasources/PdoManager.php b/src/models/datasources/PdoManager.php
index 0a96857ec..bfe8150ed 100644
--- a/src/models/datasources/PdoManager.php
+++ b/src/models/datasources/PdoManager.php
@@ -272,10 +272,27 @@ class PdoManager extends DatasourceManager
}
return $this->pdo->lastInsertId();
}
+ /**
+ *
+ */
public function closeCursor($result)
{
$result->closeCursor();
}
+ /**
+ *
+ */
+ public function beginTransaction()
+ {
+ $this->pdo->beginTransaction();
+ }
+ /**
+ *
+ */
+ public function commit()
+ {
+ $this->pdo->commit();
+ }
/**
* {@inheritDoc}
*