随着对存储过程的调用并行进行,所有这些运行实例都将获得相同的值,并且在尝试插入增量值时,五个操作中的第一个成功,其余四个操作失败了,说该领域是独一无二的。 我试图使用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; 如果问题持续存在
SELECT MAX(myRequiredField) INTO maxValueVariable FROM myTable FOR UPDATE;
如果腐败持续存在,则有几种第三方工具可以帮助数据库恢复。一种这样的工具,即MySQL的出色维修,旨在维修和恢复受损的MySQL数据库。
希望这有帮助!