gpt4 book ai didi

node.js - node-mysql2:结果集未反射(reflect)最新结果

转载 作者:太空宇宙 更新时间:2023-11-03 23:47:45 24 4
gpt4 key购买 nike

我正在使用带有连接池的node-mysql2,连接限制为10。当我重新启动应用程序时,结果很好 - 它们与我在数据库上的内容相匹配。但是,当我开始插入新记录并重做相同的选择查询时,我会得到间歇性结果,缺少我刚刚添加的最新记录。

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

我认为这是一个错误,但我的代码设置方式如下:

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,我将无法重现该问题...至少目前还不能重现

知道我做错了什么吗?

最佳答案

connection_limit 设置为 1 有一个有趣的副作用:它会序列化从 Node 程序到数据库的所有访问。每个操作(无论是 INSERT 还是 SELECT)都必须在下一个操作开始之前运行完成,因为它必须等待池中的一个连接释放。

间歇性丢失行可能是由于池中的不同连接对 DBMS 的并发访问造成的。如果您在 MySQL 处理来自另一连接的 INSERT 时从一个连接执行 SELECT,则 SELECT 将不会总是找到正在插入的行。这是一个特点。它是 ACID (atomicity, consistency, isolation, durability) 的一部分。 ACID 对于 DBMS 的扩展至关重要。

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

编辑 多个数据库连接,甚至来自同一程序中同一池的连接,都彼此独立工作。因此,如果您在一个连接上执行尚未提交的事务并在另一个连接上执行查询,则查询(通常)将反射(reflect)事务开始之前数据库的状态。查询不能强制事务回滚,除非它以某种方式导致死锁。但是死锁会产生错误消息;您可能没有看到任何内容。

有时,您可以在同一连接上使用 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 来控制查询所看到的内容。在繁忙的 DBMS 上,只要您愿意让查询只看到事务的一部分,就可以稍微提高查询性能,并防止一些死锁。我用它来进行历史查询(昨天发生了什么)。已记录here 。默认值(解释您所看到的内容)是 SET TRANSACTION LEVEL REPEATABLE READ;

但是,在需要之前避免使用这种隔离级别的东西。 (该建议属于“太聪明就是愚蠢”的总标题。)

关于node.js - node-mysql2:结果集未反射(reflect)最新结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60432745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com