Node.js node-mysql2:resultset未反映最新结果

Node.js node-mysql2:resultset未反映最新结果,node.js,concurrency,acid,node-mysql2,Node.js,Concurrency,Acid,Node Mysql2,我使用的node-mysql2有一个连接池,连接限制为10。当我重新启动应用程序时,结果很好——它们与我在db上的结果相匹配。但是,当我开始插入新记录并重新执行相同的select查询时,我会得到间歇性的结果,其中缺少我刚才添加的最新记录 如果我直接检查数据库,我可以看到我刚刚通过应用程序添加的记录。只有应用程序无法以某种方式看到它 我认为这是一个bug,但我的代码设置如下: module.exports.getDB = function (dbName) { if (!(dbName i

我使用的node-mysql2有一个连接池,连接限制为10。当我重新启动应用程序时,结果很好——它们与我在db上的结果相匹配。但是,当我开始插入新记录并重新执行相同的select查询时,我会得到间歇性的结果,其中缺少我刚才添加的最新记录

如果我直接检查数据库,我可以看到我刚刚通过应用程序添加的记录。只有应用程序无法以某种方式看到它

我认为这是一个bug,但我的代码设置如下:

module.exports.getDB = function (dbName) {
    if (!(dbName in dbs)) {
        console.log(`Initiating ${dbName}`);
        let config = dbConfigs[dbName];
        dbs[dbName] = mysql.createPool({
            host: config.host,
            port: config.port || 3306,
            user: config.user,
            password: config.password,
            connectionLimit: 10,
            database: config.database,
            debug: config.debug
        });
    }
    return dbs[dbName]; // I just initialize each database once
};
这是我的选择查询:

let db = dbs.getDB('myDb');
const [rows] = await db.query(`my query`);
console.log(rows[0]); // this one starts to show my results inconsistently once I insert records

这是我的插入查询:

module.exports = {
    addNote: async function(action, note, userID, expID) {
        let db = dbs.getDB('myDb');

        await db.query(`INSERT INTO experiment_notes (experiment_id, action, created_by, note)
                            VALUES (?, ?, ?, ?)`, [expID, action, userID, note]);
    }
};
如果我将connectionLimit设置为1,则无法重现该问题。。。至少现在还没有


知道我做错了什么吗?

将您的
连接限制设置为1有一个有趣的副作用:它会序列化从节点程序到数据库的所有访问。每个操作,无论是插入操作还是选择操作,都必须在下一个操作开始之前运行到完成,因为它必须等待池中的一个连接释放

可能是由于池中的不同连接并发访问DBMS而导致间歇性丢失行。如果在MySQL处理来自另一个连接的插入时从一个连接执行SELECT,SELECT不会始终找到插入的行。这是一个特点。这是我的一部分。ACID对于DBMS的扩展至关重要

在比您展示的更复杂的应用程序中,当您使用DBMS事务而忘记提交它们时,也会发生同样的情况

编辑多个数据库连接,甚至来自同一程序中同一池的连接,彼此独立工作。因此,如果在一个连接上执行尚未提交的事务,在另一个连接上执行查询,则查询(通常)将反映事务启动前数据库的状态。查询无法强制事务回滚,除非它以某种方式导致死锁。但是死锁会产生错误消息;你可能什么也没看到

有时,您可以通过在同一连接上的查询前面加上
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED来控制查询所看到的内容。在繁忙的DBMS上,这可以稍微提高查询性能,并防止一些死锁,只要您愿意让查询只看到事务的一部分。我使用它进行历史查询(昨天发生的事情)。记录在案。默认设置是
SET事务级别可重复读取


但是,除非你需要,否则不要使用那种隔离级别的东西。(这条建议的总标题是“太聪明是愚蠢的”)

几分钟后检查表时,是否找到了插入的所有记录?还是有些唱片从来没有上过榜?请澄清您的问题。请编辑它。是的,我可以看到表中的记录。这很可能就是问题所在。我在事务中调用了一个函数,这个函数将获得一个新的db处理程序,而不是从事务中使用相同的db处理程序。这可能类似于:
事务启动一些sql指令,使用不同的db句柄调用函数,使用原始db句柄执行其他sql提交
我所期望的是,如果由于某种原因出现问题,整个事务将回滚,除非在该函数中执行了任何操作。但否则,一切都会正常进行。这个假设是错误的吗?