MariaDB避免死锁

时间:2017-07-12 16:07:35

标签: php mysql mariadb deadlock galera

我原来的错误是

  

错误号码:1213 - 尝试锁定时发现死锁;尝试   重启交易

好的,所以我编写了一个循环,其中包含最大重试次数以及介于两者之间的等待以尝试解决死锁问题。

$Try = 0;
while (!$Result = $dbs->query($MySQL)) {
    $Try++;
    if ($Try === MYSQL_MAX_RETRIES)
        HandleMySQLError($dbs->error, $MySQL, false, $Test, $Trace);
    else 
        sleep(MYSQL_RETRY_WAIT);
}

但是现在我不断地收到一些原始错误,并出现新错误

  

得到错误35"避免资源死锁"在COMMIT期间

但我似乎无法找出这意味着什么或如何解决它?

修改

当我第一次写这篇文章时,我遗漏了大量的信息,但服务器是Galera& Galera&amp ;;中的RedHat 7 AWS EC2(好吧,其中3个)。 MariaDB集群。

我正在运行的查询是对存储过程的调用

call`getchatmessages`('<ChatID>','<UserID>',from_unixtime('<Some Timestamp>'));

存储过程如下

CREATE DEFINER=`root`@`%` PROCEDURE `getchatmessages`(IN `__ChatID` CHAR(36), IN `__UserID` CHAR(36), IN `__Timestamp` TIMESTAMP(6))
BEGIN

DECLARE `__NewChatMessages` TINYINT(1) DEFAULT 0;
DECLARE `__i` INT(11) DEFAULT 0;

DECLARE `__Interval` INT(11) DEFAULT 100; -- ms
DECLARE `__Timeout` INT(11) DEFAULT 15000; -- ms

while `__NewChatMessages`=0 and `__i`<`__Timeout`/`__Interval` do
    select 1 into `__NewChatMessages` from `chatmessages` where `ChatID`=`__ChatID` and `DateTimeAdded`>ifnull(`__Timestamp`,0) limit 1;
    update `chatusers` set `DateTimeRead`=now(6) where `ChatID`=`__ChatID` and `UserID`=`__UserID`;
    do sleep(`__Interval`/1000);
    set `__i`=`__i`+1;
end while;

select `chatmessages`.`Body`, `chatmessages`.`ChatID`, `chatmessages`.`UserID`, 
`chatmessages`.`ChatMessageID`, `chatmessages`.`DateTimeAdded`, UNIX_TIMESTAMP(`chatmessages`.`DateTimeAdded`) `Timestamp`, `users`.`FirstName`,
`users`.`LastName`
from `chatmessages` 
join `users` using (`UserID`) 
where `chatmessages`.`ChatID`=`__ChatID` 
and `chatmessages`.`DateTimeAdded`>ifnull(`__Timestamp`,0) 
order by `chatmessages`.`DateTimeAdded` desc
limit 100;

END

1 个答案:

答案 0 :(得分:3)

Galera集群中的死锁(MariaDB Galera集群,3个节点)不是典型的死锁,而是一种沟通多主冲突的方式:

http://galeracluster.com/documentation-webpages/dealingwithmultimasterconflicts.html

避免死锁的最简单方法是一次写入1个节点,即将HA代理配置为仅写入1个节点。在你的情况下,你将在Node1上运行sp(与哪个节点无关,但总是在1个节点上,类似于“粘性会话”)。

此处提供更多信息:https://severalnines.com/blog/avoiding-deadlocks-galera-set-haproxy-single-node-writes-and-multi-node-reads