mysql - 事务提交后验证错误

标签 mysql node.js express sequelize.js

我正在开发一个使用 Sequelize 5.21.5 和 MySql 5.5 作为数据库引擎的 Node 项目。

我有一种方法可以将值插入到多对多关系中使用的链接表中。链接表上有一个唯一约束,它规定两个 id 字段的组合必须是唯一的。

enter image description here

我希望能够同时将多个条目插入到 user_levels 表中。我尝试通过使用 sequelize 事务来做到这一点。我首先添加一个 userLevel,userId 为 1,levelId 为 9(尚不存在),然后我添加另一个 userLevel 为 1,levelId 为 8(确实存在)的 userLevel。

我预计事务会失败并回滚,但是事务已提交,并且只添加了 levelId 为 9 的 userLevel,并且为 levelId 为 8 的 userLevel 抛出了验证错误。

我怎样才能让交易整体失败并回滚?

  updateLevelsForUser = async (req: Request, res: Response): Promise<any> => {
    const userId: number = parseInt(req.params.userId, 10);
    const levelIds: number[] = [9, 8];

    Database.getInstance().sequelize.transaction(async (t) => {
      for (let i = 0; i < levelIds.length; i += 1) {
        UserLevel.create<UserLevel>(
          {
            userId,
            levelId: levelIds[i],
          },
          { transaction: t },
        );
      }
    });
  };

输出:
Executing (0efdccac-6d93-4434-8ac4-1ff291d65178): START TRANSACTION;
Executing (0efdccac-6d93-4434-8ac4-1ff291d65178): INSERT INTO `user_levels` (`id`,`userId`,`levelId`) VALUES (DEFAULT,?,?);
Executing (0efdccac-6d93-4434-8ac4-1ff291d65178): INSERT INTO `user_levels` (`id`,`userId`,`levelId`) VALUES (DEFAULT,?,?);
Executing (0efdccac-6d93-4434-8ac4-1ff291d65178): COMMIT;
Unhandled rejection SequelizeUniqueConstraintError: Validation error

最佳答案

您忘记在 UserLevel.create 之前添加 await

Database.getInstance().sequelize.transaction(async (t) => {
      for (let i = 0; i < levelIds.length; i += 1) {
        await UserLevel.create<UserLevel>(
          {
            userId,
            levelId: levelIds[i],
          },
          { transaction: t },
        );
      }
    });

关于mysql - 事务提交后验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61826663/

相关文章:

mysql time_format函数问题

mysql - 如何在 MYSQL 中通过另一列选择具有 MAX(列值)、PARTITION 的行?

node.js - Node JS 和 Sequelize 错误 : Cannot set headers after they are sent to the client

html - 在 NodeJS 提供的静态 html 中显示本地镜像

mysql - 创建唯一的 ID 组合

php - 使用 jquery 创建多个表单输入的 id 和值的数组

javascript - ngrok 无法获取/本地服务器启动并运行

node.js - docker-compose POSTGRES & SEQUELIZE 的数据库连接错误

javascript - npm left-pad 的取消发布是如何破坏代码的?

mysql - 无法使用Nodejs连接Azure Mysql