首页 > 解决方案 > 具有多个查询的 mysql 事务不起作用 Amazon RDS

问题描述

我正在使用一个包来简化我的 RDS 查询Link Here,如果我使用嵌套查询有效但在使用多个查询时出错,这是我的代码

insert = await rds_client.transaction()
        .query(`insert into RFP (AccountID, OtherServicesOffered, AssignedTo, Note, CreatedBy,RFPType,RenewalID) values (:AccountID, :OtherServicesOffered, :AssignedTo, :Note, :CreatedBy,:RFPType,:RenewalID)`,
        {
            AccountID:data.AccountID,
            OtherServicesOffered:data.OtherServicesOffered,
            AssignedTo:data.AssignedTo,
            Note:data.Note,
            CreatedBy:data.CreatedBy,
            RenewalID:(data.RenewalID) ? data.RenewalID : null,
            RFPType:(data.RFPType) ? data.RFPType : 0,
        }
    )
     .query((r) => [codestringCurrentlyOffered, {RFPID: r.insertId}] )
     .query((r) => [codestringToBeQuoted, {RFPID: r.insertId}] )
     .commit();
    }

如果我注释掉.query((r) => [codestringToBeQuoted, {RFPID: r.insertId}] ) 一切似乎正常工作,这是我尝试同时运行时的错误

Cannot add or update a child row: a foreign key constraint fails (`vytaldb`.`RFPToBeQuoted2Product`, CONSTRAINT `RFPToBeQuoted2Product_ibfk_1` FOREIGN KEY 

两个表上都有一个外键约束,如果我删除它开始处理两个查询,知道可能是什么问题吗?

标签: mysqlnode.js

解决方案


问题是这r只是第二次调用中第一个INSERT查询的结果。query()在第三次调用中,r包含 的结果codestringCurrentlyOffered,而不是插入的查询RFP,因此r.insertid不是新RFP行的 ID。

所以你需要在同一个r变量的范围内执行这两个查询。

insert = await rds_client.transaction()
        .query(`insert into RFP (AccountID, OtherServicesOffered, AssignedTo, Note, CreatedBy,RFPType,RenewalID) values (:AccountID, :OtherServicesOffered, :AssignedTo, :Note, :CreatedBy,:RFPType,:RenewalID)`,
        {
            AccountID:data.AccountID,
            OtherServicesOffered:data.OtherServicesOffered,
            AssignedTo:data.AssignedTo,
            Note:data.Note,
            CreatedBy:data.CreatedBy,
            RenewalID:(data.RenewalID) ? data.RenewalID : null,
            RFPType:(data.RFPType) ? data.RFPType : 0,
        }
    );
await insert.query(r => [codestringCurrentlyOffered, {RFPID: r.insertId}] );
await insert.query(r = [codestringToBeQuoted, {RFPID: r.insertId}]);
await insert.commit();

推荐阅读