我有工作“存储过程”运行一夜。我时不时地陷入僵局。我想编写一个代码,如果发现死锁,将在15分钟后执行相同的程序,最多3次。
假设现在的时间是上午10点。然后在上午10点运行,如果发现死锁,请在上午10:15再次呼叫该作业,然后在上午10:30“如果死锁”,则在上午10:45“如果死锁定”。如果上次运行死锁,则完全终止作业。
这是我所做的。
DECLARE totalTrys INT DEFAULT 0;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
@err_num = MYSQL_ERRNO;
if(@err_num = 1213 AND totalTrys < 4) THEN
SET totalTrys = totalTrys + 1;
SELECT SLEEP(900);
CALL guardi.prod_update_guardi_accounts();
END IF;
END;
这是一种有效的方法吗?除了一起消除死锁之外还有更好的方法吗?
答案 0 :(得分:0)
我会保留程序中的所有内容:然后,与此行为相关的所有代码都在一个位置。另外:死锁是不是会执行你的CALL语句而不是继续?如果继续,它可能已经解决了,我们就等不及了。此外,死锁之后的事务只会在死锁解决后执行。
我的代码方法是:
CREATE PROCEDURE manageAccounts()
BEGIN
DECLARE totalTrys INT DEFAULT 0;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
GET DIAGNOSTICS CONDITION 1
@err_num = MYSQL_ERRNO;
CALL guardi.prod_update_guardi_accounts();
WHILE(@err_num = 1213 AND totalTrys < 4) DO
SET totalTrys = totalTrys + 1;
SELECT SLEEP(900);
CALL guardi.prod_update_guardi_accounts();
END WHILE;
END;
你必须测试这个:未经测试,所以拼写错误并非不可能。