diff options
author | Thomas Bruederli <thomas@roundcube.net> | 2013-09-12 17:17:07 +0200 |
---|---|---|
committer | Thomas Bruederli <thomas@roundcube.net> | 2013-09-12 17:17:07 +0200 |
commit | 0ee22c2145482571014d843ffa899ef579317eb7 (patch) | |
tree | 3be8bd68c43d5351a12464bfb5bcd68ac8e0ee0a /program/lib/Roundcube/rcube_db_mysql.php | |
parent | f806ed5c9e66e970efb958f087530b1b75afcd78 (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.php | 25 |
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); + } + } |