gpt4 book ai didi

mysql - NodeJS 如何处理对 MySQL 的并发请求

转载 作者:搜寻专家 更新时间:2023-10-30 22:26:46 24 4
gpt4 key购买 nike

我在使用 NodeJS 时遇到问题。当我尝试发布/更新时

  • 一笔余额
  • 一个账号
  • 来自两个不同的用户
  • 同时。

示例:

example of t_account table

我有 ExpressJS 的 API,可以像这样将数据发布到 t_account 表。

我需要在每次交易后首先从 max(id) 获取最新余额。

我正在尝试获得 400 的余额 NOT 300

例如:

  1. 起始余额 = 100
  2. 第一个新帖子 = 100,=> 余额 =200
  3. 第 2 个新帖子 = 200,=> 余额 =400

代码示例:

router.post('/saveBalance',async function (req, res) {
try {
let SQL="SELECT balance FROM t_account WHERE id=(SELECT max(id) FROM t_account WHERE no='"+req.body.no+"')";
let queryResult=await db.myexec(SQL);
let newBalance=queryResult[0].balance+req.body.balance;
let SQL2="INSERT INTO t_account(no,balance) VALUES('"+req.body.no+"',"+newBalance+")";
let queryResult2=await db.myexec(SQL2);
res.status(200).json( {
error:"false",
code:"00",
message:"Balance Bank is saved",
})
} catch (error) {
res.status(400).json( {
error:"true",
code:"03",
message:"Balance Bank failed to saved",
})
}})

问题是当两个用户同时发布数据时,我得到的余额不正确。

初始化交易的代码示例:

const axios = require('axios');
axios.post('http://localhost:3000/rbank/saveBalance/',
{
"no":"11",
"balance":100
}
)
axios.post('http://localhost:3000/rbank/saveBalance/',
{
"no":"11",
"balance":200
}
)

MySQL 控制台日志

enter image description here enter image description here

最后余额不正确显示 300 而不是 400。

这里出了什么问题?

最佳答案

您需要锁定您正在阅读的行,以便您可以在其他人阅读之前更新该行。看innodb-locking-reads ,特别是更新

来自文档

Locking of rows for update using SELECT FOR UPDATE only applies when autocommit is disabled (either by beginning transaction with START TRANSACTION or by setting autocommit to 0. If autocommit is enabled, the rows matching the specification are not locked.

关于mysql - NodeJS 如何处理对 MySQL 的并发请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50185816/

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