发生死锁时如何递归调用过程?
How to recursively call a procedure when there is a deadlock?
我有工作 "stored procedures" 运行 过夜。我时不时 运行 陷入僵局。我想编写一个代码,如果发现死锁,将在 15 分钟后最多执行 3 次相同的过程。
假设现在时间是上午 10 点。然后 运行 它在上午 10 点,如果发现死锁,在 10:15AM 再次调用作业,然后在 10:30AM "if dead locked",然后 10:45AM "if dead locked."如果最后一个 运行 死锁则完全终止作业。
这是我所做的。
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;
这是一种有效的方法吗?除了一起消除死锁还有更好的方法吗?
我会保留过程中的所有内容:然后与此行为相关的所有代码都在一个位置。另外:死锁不会跟随你的 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;
你将不得不测试这个:未经测试,所以错别字并非不可能。
我有工作 "stored procedures" 运行 过夜。我时不时 运行 陷入僵局。我想编写一个代码,如果发现死锁,将在 15 分钟后最多执行 3 次相同的过程。
假设现在时间是上午 10 点。然后 运行 它在上午 10 点,如果发现死锁,在 10:15AM 再次调用作业,然后在 10:30AM "if dead locked",然后 10:45AM "if dead locked."如果最后一个 运行 死锁则完全终止作业。
这是我所做的。
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;
这是一种有效的方法吗?除了一起消除死锁还有更好的方法吗?
我会保留过程中的所有内容:然后与此行为相关的所有代码都在一个位置。另外:死锁不会跟随你的 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;
你将不得不测试这个:未经测试,所以错别字并非不可能。