【问题标题】:the version 5.7 of mysql make lock table by default?mysql 5.7版本默认make lock table?
【发布时间】:2019-12-31 12:01:13
【问题描述】:

我正在研究锁表,但我有一些疑问,我找不到关于我的问题的答案。

我有一个 mysql 数据库(版本 5.7)和一个网站(PHP 7.0),您可以在其中购买一些音乐会的门票。
所以,我有一张桌子,上面有每场音乐会的门票数量。
当用户点击预订按钮时,我会在 mysql 中调用一个程序来检查是否有票,如果答案是肯定的,则减少数量并下订单。
所有的表都有 InnoDB 引擎。

表格
名称:concert_ticket
:id(主键,自动增量),concert_id,ticket_number p>

代码

$querySituation = $db->query("CALL decrementConcert('".$idConcert."',@response)");
$requestSituation = $db->Query("SELECT @response as result;");
$resultProcedure = $requestSituation->fetch_assoc();
if($resultProcedure['result'] != 0){ 
    //insert order
}

现在,我的问题是:
1.这种情况下是否需要主动锁表?
2. 在mysql 5.7 中,是否需要默认锁定表?或者我必须始终在我的代码中手动执行此操作?
3.要使用锁表,我必须在过程之前用查询锁定表,插入后解锁表?

【问题讨论】:

  • "当用户点击预订按钮时,我会在 mysql 中调用一个程序来检查是否有票,如果答案是肯定的,则减少数量并下订单。" 你应该研究 InnoDB 引擎和事务..

标签: mysql


【解决方案1】:
  1. 首先,您的表应该使用支持事务的 InnoDB 引擎。
  2. 其次,您应该在带有START TRANSACTION; 的事务下运行以下命令
  3. 您的程序应该使用SELECT ... FOR UPDATE; 读取当前可用的票数。这将锁定该行。
  4. 如果票可用,您可以更新可用票数并COMMIT 交易。
  5. 如果票不可用,您可以ROLLBACKCOMMIT(您没有进行任何更改)。

【讨论】:

  • 非常感谢@Ronald。该表使用 InnoDB 引擎,我立即通过输入此值来更新问题。
猜你喜欢
  • 1970-01-01
  • 2016-03-03
  • 2020-11-06
  • 1970-01-01
  • 2017-02-18
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
相关资源
最近更新 更多