From 0ee22c2145482571014d843ffa899ef579317eb7 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Thu, 12 Sep 2013 17:17:07 +0200 Subject: Retry queries on deadlock errors from InnoDB row-level locking (MySQL) --- program/lib/Roundcube/rcube_db_mysql.php | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'program/lib/Roundcube/rcube_db_mysql.php') 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); + } + } -- cgit v1.2.3