gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:35:53 24 4
gpt4 key购买 nike

我正在创建一个系统,该系统涉及许多用户在短时间内预订门票,而总共只能预订一定数量的门票。假设有 600 张可用门票,可能会在 3 小时或更短时间内全部预订。

理想情况下,我想确保未达到预订限制,因此在创建预订之前,我会检查是否可以根据可用门票数量进行预订。至关重要的是,我需要确保在该检查和将票证分配给用户之间没有发生任何更新,以确保不会超过票证限制。

我正在尝试使用 mysql 表写锁来实现此目的,但是在 codeigniter 框架中实现此目的时遇到了问题。在处理这个问题的模型中,我创建了几个函数,一个用于创建预订,另一个用于计算不同类型门票的数量。问题是他们似乎没有共享相同的数据库 session ,因为他们的票务计数功能正在锁定。

执行顺序是

  • 在 Controller 中运行 $this->model_name->create_reservation
  • 在 model_name->create_reservation 中运行锁定查询
  • 调用model_name->create_reservation中的计数方法
  • 计数函数(这是 model_name 类中的一个方法)锁定,大概是因为使用了不同的数据库 session ?

数据库library在model的__construct方法中用$this->load->database();加载

有什么想法吗?

最佳答案

在 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 and 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 - 如何在代码点火器模型中跨多个函数实现数据库锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7507780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com