ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

php – 如何在代码点火器模型中跨多个函数实现数据库锁定?

2019-06-30 14:02:38  阅读:169  来源: 互联网

标签:php mysql database codeigniter database-locking


我正在创建一个系统,涉及许多用户在很短的时间内预订门票,总共只有一定数量的预订.说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,mysql,database,codeigniter,database-locking
来源: https://codeday.me/bug/20190630/1337144.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有