go mysql 多并发_MySQL并发处理-Go语言中文社区
发布日期:2021-06-24 17:54:46 浏览次数:2 分类:技术文章

本文共 685 字,大约阅读时间需要 2 分钟。

在TP下的实验:public function mysql_a()

{

db('goods')->where('id',2)->setInc('num');

$info = db('goods')->where('id',1)->find();

sleep(1);

if( $info['num']>0 ){

db('goods')->where('id',1)->setDec('num');

}

}

模拟并发请求:

687a5a738b19ae30b3da50ea5ae61d00.png

执行前:

42fd0e440bcaec2661a528daca9859b8.png

执行后:

f65b9fd9244cbfdc6504ea4f9474d12b.png

压测结果:

e4143919fe276dabe595f57e59d3178e.png

如果当前为抢购或秒杀场景,此时就会出现超卖情况。

解决方案:public function mysql_a()

{

// 启动事务

Db::startTrans();

try {

Db::name('goods')->where('id',2)->setInc('num');

$num = Db::name('goods')->where('id',1)->lock(true)->value('num');

sleep(1);

if( $num>0 ){

Db::name('goods')->where('id',1)->setDec('num');

}

// 提交事务

Db::commit();

} catch (Exception $e) {

// 回滚事务

Db::rollback();

}

}

压测结果:

f589effd73368c45d133ce2e64200f01.png

加上lock(true)的实际就是在查询语句最后加上 for update(必须跟事务同时使用),此时新开窗口再次查询加锁这条数据,你会发现另一个窗口的查询会一直等待,直到第一个窗口的事务提交。

转载地址:https://blog.csdn.net/weixin_34237125/article/details/113889282 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:mysql定义变量字符串类型_mysqli_stmt :: bind_param():类型定义字符串中的元素数量与绑定变量的数量不匹配...
下一篇:基于mysql学生签到_Java swing mysql学生签到考勤系统附带完整源码及开发视频

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月29日 10时35分37秒