介绍thinkphp lock锁的使用和例子

下面由thinkphp教程栏目给大家介绍thinkphp lock锁的使用和例子,希望对需要的朋友有所帮助!

介绍thinkphp lock锁的使用和例子

在开发需求中会遇到这样一种情况,并发请求。数据库的更新还没执行结束,另一个select查出的数据,会是更新之前的数据,那就会造成查询数据不准确。

那怎么解决呢?用innoDB的事务和锁就能解决这个问题。在我们当前行更新还没结束的时候,select查询此行的数据会被锁起来。

比如我们数据库有这样两行数据
在这里插入图片描述
我们把id=1的num数据更新为1000,sleep10秒,这时候我们select id=1的数据时,会等待update的更新结束,如果我们select id=2的时候,不需要等待10秒,会立马获取到数据。
这就是InnoDB的行锁,只会锁当前update的那行数据,不会锁整表。
下面会列出测试代码,记得吧引擎改为innoDB,不是MYISAM。

SpeakingPass-打造你的专属雅思口语语料 SpeakingPass-打造你的专属雅思口语语料

使用chatGPT帮你快速备考雅思口语,提升分数

SpeakingPass-打造你的专属雅思口语语料 25 查看详情 SpeakingPass-打造你的专属雅思口语语料

立即学习“PHP免费学习笔记(深入)”;

class Index extends Controller{    public function index()    {        $model=Db::name('test');        $model->startTrans();        try{            $list=$model->lock(true)->find();            $model->where(['id'=>1])->data(['num'=>900])->update();//id为1的更新            sleep(10);//等待10秒            $model->commit();            print_r($list);        }catch (Exception $exception){            $model->rollback();            throw $exception;        }    }    public function index2(){        $model=Db::name('test');        $model->startTrans();        try{            $list=$model->lock(true)->where(['id'=>1])->find();//id为1在更新时,select id=1 会等待。把ID改为2时,不等待            $model->commit();            print_r($list);        }catch (Exception $exception){            $model->rollback();            throw $exception;        }    }}

测试步骤:请求index后,在请求index2,就会看到index2会等index加载结束,我们才能看到index2的打印结果。如果index2的id改为2后,则不会受到index的影响。

相关推荐:最新的10个thinkphp视频教程

以上就是介绍thinkphp lock锁的使用和例子的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/483207.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 12:19:36
下一篇 2025年11月8日 12:21:09

相关推荐

发表回复

登录后才能评论
关注微信