Try to put Recommendation job components into transactions to see if can stop DB locking, a=chris

Chris Pollett [2022-12-15 21:Dec:th]
Try to put Recommendation job components into transactions to see if can stop DB locking, a=chris
Filename
src/library/media_jobs/RecommendationJob.php
src/models/datasources/DatasourceManager.php
src/models/datasources/PdoManager.php
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}
      *
ViewGit