MYSQL存储的过程失败 /陷入僵局,试图插入手动增加的唯一键字段

问题描述 投票:0回答:1
在存储过程中,我需要在表中插入一行,例如,它具有所需的唯一密钥字段,例如,此字段没有自动增加,因此我需要找到最大值/该表中该字段的上一个值,将其递增并将其用于下一个插入。

随着对存储过程的调用并行进行,所有这些运行实例都将获得相同的值,并且在尝试插入增量值时,五个操作中的第一个成功,其余四个操作失败了,说该领域是独一无二的。 我试图使用mySQL的

myTable

,以便我可以防止另一个实例阅读字段,但我无法做到,因为对此表的插入插入是在循环中完成的。从我的理解来看,

myRequiredField
发起的锁才能在交易进行时解锁。就我而言,交易仅在循环结束后进行。因此,在第二次迭代期间,锁仍然存在,我正在僵持。

即使我试图修改代码以避免循环,但执行不断陷入僵局。 tollowing是我sp中相关部分的伪代码:

myRequiredField
在上面的代码中,由于有并行调用,并行实例将获得相同的最大值,并且插入失败的情况下会出现唯一的约束错误。
我尝试了多种处理此问题的方法。但是,无法修复它。目前,我停止了并行电话,它运行良好,但要完成4倍完成。由于这是一个至关重要的操作,因此我需要解决此问题并并行运行。

任何帮助将不胜感激!

    

我知道,这里的主要问题是处理并行执行,同时确保Myrequiredfield的独特价值。多个存储过程调用获取相同的最大值,从而导致唯一的约束错误。

为了解决此问题,请使用命令:
使用选择...用于更新以锁定行
在阅读最大值之前,请锁定行以防止同时访问:

SELECT ... FOR UPDATE

使用单独的序列表 而不是计算Max(myrequiredfield),而是创建一个序列表并在原子上进行更新

FOR UPDATE

将last_insert_id()选择为maxvaluevariable;
使用auto_increment列
让MySQL自动处理唯一值。
try插入...选择而不是循环

使用单个原子查询而不是循环:

DEFINE i INT DEFAULT 0; DEFINE maxValueVariable INT; START TRANSACTION; -- some other selects and inserts -- sample loop WHILE i < 5 DO -- getting the existing max value SELECT MAX(myRequiredField) INT maxValueVariable FROM myTable; -- incrementing and inserting INSERT INTO myTable(field1, field2, myRequiredField) VALUES(value1, value2, maxValueVariable +1); END WHILE; COMMIT;

选择值1,value2,cocce(max(myRequiredfield),0) + 1来自mytable; 如果问题持续存在
sql mysql stored-procedures deadlock
1个回答
0
投票

SELECT MAX(myRequiredField) INTO maxValueVariable FROM myTable FOR UPDATE;

如果腐败持续存在,则有几种第三方工具可以帮助数据库恢复。一种这样的工具,即MySQL的出色维修,旨在维修和恢复受损的MySQL数据库。

希望这有帮助!


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.