【问题标题】:MySQL insert executed successfully and return ID, But not saving data sometimes while concurrencyMySQL插入成功执行并返回ID,但有时并发时不保存数据
【发布时间】:2021-02-08 09:07:38
【问题描述】:

我遇到了一个奇怪的问题。 我使用的是 MySQL Enterprise Server VERSION 8。

我有一个 API,它在 Mysql 数据库中执行以下语句:

START TRANSACTION;
Many select statements;
INSERT INTO ... VALUES(...);
COMMIT;
Many select statements;

这是在一个表中插入并检索表中新创建记录的 ID。 当服务器负载低时调用此 api 时,这可以正常工作。

但是当服务器负载增加时,执行良好,还返回新创建的记录ID,但没有将记录保存到数据库中。

目前,如果我同时从前端调用此 API 25 次,则此问题会发生 1 到 2 次。即我可以在日志中看到所有查询和事务,并且都给出了记录的 ID,但是 1-2 条记录没有保存在数据库中。

如果有任何想法,任何人都可以帮助我吗?

【问题讨论】:

    标签: mysql concurrency yii


    【解决方案1】:

    当我处理高并发时,我使用 ON DUPLICATE KEY UPDATE 语句。这可能会解决您的问题。

    https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

    但是数据没有插入数据库,但是服务器没有报错为什么

    【讨论】:

    • 不,我不能使用它,因为如果存在密钥,我不必更新。目前,如果我调用 API,那么所有成功都只是按顺序提供 ID,而不是重复的,因为那是自动增量主键 ID。
    • 不,这个操作只是遵循幂等性原则。你应该在代码中判断if isExist() toUpdate() else toInsert()并发时,不能保证isExist()方法会得到正确的结果,所以使用ON DUPLICATE KEY UPDATE。注意ON DUPLICATE KEY UPDATE只在toInsert()中使用,toUpdate()中不需要,这也不是更新语句。它只保证插入时同一个primary key只有一条记录。
    猜你喜欢
    • 1970-01-01
    • 2019-03-03
    • 2019-01-28
    • 2020-03-30
    • 1970-01-01
    • 2018-01-19
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多