php – 如何在代码点火器模型中跨多个函数实现数据库锁定?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – 如何在代码点火器模型中跨多个函数实现数据库锁定?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1789字,纯文字阅读大概需要3分钟。
内容图文
我正在创建一个系统,涉及许多用户在很短的时间内预订门票,总共只有一定数量的预订.说600张门票,可能都是在3小时或更短的时间内保留的.
理想情况下,我希望确保未达到预订限制,因此在创建预订之前,我正在检查是否可以根据可用的门票数进行预订.至关重要的是,我需要确保在检查和将票证分配给用户之间不进行更新,以确保不会超过票证限制.
我正在尝试使用mysql表写锁来实现这一点,但是我遇到了在codeigniter框架内实现这个问题.在处理这个模型的过程中,我创建了几个函数,一个用于创建预留,另一个用于计算不同类型票证的数量.问题是它们似乎没有共享相同的数据库会话,因为票据计数功能正在锁定.
执行顺序是
>在控制器中运行$this-> model_name-> create_reservation
>在model_name-> create_reservation中运行锁定查询
> model_name-> create_reservation中的调用计数方法
>计数函数(这是model_name类中的一个方法)锁定,大概是因为使用不同的数据库会话?
使用$this-> load-> database();在模型__construct方法中加载数据库库.
有任何想法吗?
解决方法:
在mysql中,在运行查询之前,在数据库句柄上运行这些命令,表将自动锁定:
begin work;
然后运行查询或让代码点火器使用该数据库句柄运行各种选择和更新.
然后你要么
commit;
要么
rollback;
您选择的任何行都将被锁定,其他进程无法读取.如果您特别希望行仍然可读,您可以执行以下操作:
Select ... IN SHARE MODE
来自Mysql文档:
http://dev.mysql.com/doc/refman/5.5/en/select.html
如果对使用页锁或行锁的存储引擎使用FOR UPDATE,则查询检查的行将被写入锁定,直到当前事务结束.使用LOCK IN SHARE MODE设置共享锁,允许其他事务读取已检查的行,但不允许更新或删除它们.请参见第13.3.9.3节“SELECT … FOR UPDATE和SELECT … LOCK in SHARE MODE Locking Reads”.
另一个人已在评论中说过,但是来自CI文档:
$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->query('AND YET ANOTHER QUERY...');
$this->db->trans_complete();
trans_start和trans_complete将在您的句柄上为您运行这些查询…
可能还有一个trans_rollback ……
内容总结
以上是互联网集市为您收集整理的php – 如何在代码点火器模型中跨多个函数实现数据库锁定?全部内容,希望文章能够帮你解决php – 如何在代码点火器模型中跨多个函数实现数据库锁定?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。