环境:
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()没有生效。
这是为什么啊?