summaryrefslogtreecommitdiff
path: root/program/lib/Roundcube/rcube_db_mysql.php
diff options
context:
space:
mode:
authorThomas Bruederli <thomas@roundcube.net>2013-09-12 17:17:07 +0200
committerThomas Bruederli <thomas@roundcube.net>2013-09-12 17:17:07 +0200
commit0ee22c2145482571014d843ffa899ef579317eb7 (patch)
tree3be8bd68c43d5351a12464bfb5bcd68ac8e0ee0a /program/lib/Roundcube/rcube_db_mysql.php
parentf806ed5c9e66e970efb958f087530b1b75afcd78 (diff)
Retry queries on deadlock errors from InnoDB row-level locking (MySQL)
Diffstat (limited to 'program/lib/Roundcube/rcube_db_mysql.php')
-rw-r--r--program/lib/Roundcube/rcube_db_mysql.php25
1 files changed, 25 insertions, 0 deletions
diff --git a/program/lib/Roundcube/rcube_db_mysql.php b/program/lib/Roundcube/rcube_db_mysql.php
index 6fa5ad768..24f9ce1bd 100644
--- a/program/lib/Roundcube/rcube_db_mysql.php
+++ b/program/lib/Roundcube/rcube_db_mysql.php
@@ -179,4 +179,29 @@ class rcube_db_mysql extends rcube_db
return isset($this->variables[$varname]) ? $this->variables[$varname] : $default;
}
+ /**
+ * Handle DB errors, re-issue the query on deadlock errors from InnoDB row-level locking
+ *
+ * @param string Query that triggered the error
+ * @return mixed Result to be stored and returned
+ */
+ protected function handle_error($query)
+ {
+ $error = $this->dbh->errorInfo();
+
+ // retry after "Deadlock found when trying to get lock" errors
+ $retries = 2;
+ while ($error[1] == 1213 && $retries >= 0) {
+ usleep(50000); // wait 50 ms
+ $result = $this->dbh->query($query);
+ if ($result !== false) {
+ return $result;
+ }
+ $error = $this->dbh->errorInfo();
+ $retries--;
+ }
+
+ return parent::handle_error($query);
+ }
+
}