nodejs处理高并发问题

 

做了一个nodejs并发测试,先描述一下环境 数据库mysql,大概两张表,读取第一张表test的数据,拿出来-1,存到第二张testlog表记录一下,用jmeter同事模拟50个请求,结果发现,部分数据没有-1成功

test 表数据
id 		num 		desc
1 94 2017-02-28 14:41:17:86 testlog 表数据 id, testid, num, desc 4 1 99 2017-02-28 14:32:42:28 5 1 98 2017-02-28 14:32:43:76 6 1 97 2017-02-28 14:32:44:89 7 1 97 2017-02-28 14:32:44:88 8 1 97 2017-02-28 14:32:44:28 9 1 97 2017-02-28 14:32:44:86 10 1 97 2017-02-28 14:32:44:45 11 1 97 2017-02-28 14:32:45:48 12 1 97 2017-02-28 14:32:45:49 推测可能是同时修改数据,某一个现在没有修改完毕,下一个线程已经读取过了,导致数据更新不一致,但是nodejs不都是单线程的吗,请各位大神解析一下,谢谢 代码如下
var http = require('http'); var url = require('url'); var util = require('util'); http.createServer(function (req, res) { res.writeHead(200, { "Content-Type": "text/html;charset=utf-8" }); res.end("OK"); var mysql = require('mysql'); var connection = mysql.createConnection({ host: 'localhost', user: 'root', password: '123456', database: 'myData' }); connection.connect(); connection.query('SELECT * from test', function (err, rows, fields) { if (err) { console.log(err); return; }; var test = rows[0]; //读取num var num = test.num - 1; var id = test.id; connection.query("update test set num=" + num + ",`desc`='" + dateFormat(new Date()) + "'", function (err, res) { if (!err) { var insert = "insert into testlog(testid,num,`desc`) values ('" + id + "','" + num + "','" + dateFormat(new Date()) + "')"; connection.query(insert, function (err, res) { if (!err) { connection.end(); console.log("update sucess!"); } else { console.log(err); } }); } else { connection.end(); console.log(err); } }); }); function dateFormat(date) { var fmt = "yyyy-MM-dd hh:mm:ss:SS"; var o = { "M+": date.getMonth() + 1, //?? "d+": date.getDate(), //? "h+": date.getHours(), //С? "m+": date.getMinutes(), //? "s+": date.getSeconds(), //? "q+": Math.floor((date.getMonth() + 3) / 3), //?? "S+": date.getMilliseconds() //?ī }; if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length)); } for (var k in o) { if (new RegExp("(" + k + ")").test(fmt)) { fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); } } return fmt; } }).listen(3000);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值