go mysql 多并发_MySQL并发处理-Go语言中文社区

在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(必须跟事务同时使用),此时新开窗口再次查询加锁这条数据,你会发现另一个窗口的查询会一直等待,直到第一个窗口的事务提交。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值