我正在研究锁表,但我有一些疑问,我找不到关于我问题的答案。
我在mysql(5.7版(和一个网站(PHP 7.0(中有一个数据库,您可以在其中购买一些音乐会的门票.
所以,我有一个表格,上面有每场音乐会的门票数量。
当用户单击预订按钮时,我在mysql中调用一个程序,检查是否有门票,如果答案是肯定的, 减少数字并下订单.
所有表都有InnoDB引擎。
表
名称:concert_ticket
列:id(主键,自动增量(,concert_id,ticket_number
代码
$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。要使用锁定表,我必须在程序之前使用查询锁定表并在插入后解锁表?
- 首先,您的表应该使用支持事务的InnoDB引擎。
- 其次,您应该在带有
START TRANSACTION;
的传输下运行以下内容 - 您的过程应读取当前可用的票证计数,并带有
SELECT ... FOR UPDATE;
。这将锁定该行。 - 如果票证可用,则可以更新可用票证计数并
COMMIT
事务。 - 如果门票不可用,您可以
ROLLBACK
或COMMIT
(您没有进行任何更改(。