PHP·求助各位大佬

环境:

ThinkPHP6.0.0

PHP 7.2.10


public function api1() {
	set_time_limit(0);
	Db::startTrans();
	$rest = Db::name('menu')->lock(true)->where('id', 1)->value('rest');
	Logger::debug('rest1', $rest);
	$rest++;
	sleep(20);
	Db::name('menu')->where('id', 1)->update(['rest'=>$rest]);
	Db::rollback();
	$rest = Db::name('menu')->where('id', 1)->value('rest');
	Logger::debug('rest1+', $rest);
}

public function api2() {
	set_time_limit(0);
	Db::startTrans();
	$rest = Db::name('menu')->where('id', 1)->value('rest');
	Logger::debug('rest2', $rest);
	$rest--;
	Db::name('menu')->where('id', 1)->update(['rest'=>$rest]);
	Db::commit();
	$rest = Db::name('menu')->where('id', 1)->value('rest');
	Logger::debug('rest2+', $rest);
}

rest 初始值 999

浏览器开两个窗口,窗口1先访问api1,紧接着窗口2访问api2,数据库记录如下:

1    rest1        999    2024-05-29 10:34:04
2    rest2        999    2024-05-29 10:34:06
3    rest2+      998    2024-05-29 10:34:06
4    rest1+    1000    2024-05-29 10:34:24

这个结果就很让人疑惑,在我理解,api2会因为api1加锁而等待更新。最终结果也不应该是1000,1000说明回滚失败了,Db::rollback()没有生效。

这是为什么啊?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值