我正在创建一个系统,该系统涉及许多用户在很短的时间内预订门票,总共只有一定数量的预订。假设有600张门票,可能都是在3小时或更短时间内保留的。
理想情况下,我希望确保未达到预订限制,因此在创建预订之前,我正在检查是否可以根据可用的门票数进行预订。至关重要的是,我需要确保在检查和将票证分配给用户之间不进行更新,以确保不会超过票证限制。
我正在尝试使用mysql表写锁来实现这一点,但是遇到了在codeigniter框架内实现这个问题的问题。在处理这个模型的过程中,我创建了几个函数,一个用于创建预留,另一个用于计算不同类型票证的数量。问题是它们似乎没有共享相同的数据库会话,因为票据计数功能正在锁定。
执行顺序是
数据库库在模型__construct方法中加载,使用$ this-> load-> database();
有什么想法吗?
答案 0 :(得分:3)
在mysql中,您在运行查询之前在数据库句柄上运行这些命令,表格将自动锁定:
begin work;
然后运行查询或让代码点火器使用该数据库句柄运行各种选择和更新。
然后你要么
commit;
或
rollback;
您选择的任何行都将被锁定,其他进程无法读取。如果您特别希望行仍然可读,则可以执行以下操作:
Select ... IN SHARE MODE
来自Mysql docs:
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 ......