Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中为e-shop在MySQL中正确创建事务和/或锁表?_Php_Mysql_Transactions_Locking - Fatal编程技术网

如何在PHP中为e-shop在MySQL中正确创建事务和/或锁表?

如何在PHP中为e-shop在MySQL中正确创建事务和/或锁表?,php,mysql,transactions,locking,Php,Mysql,Transactions,Locking,我希望在我的电子商店中使用事务和/或锁定表,主要是为了避免订单id重复(它不仅仅是自动增量id) 现在我有了这个场景: 1) cart submitted by user 2) check if all informations are correcly filled 3) lock tables with products, orders and discount cupons 4) begin transaction -- try { -- 5) update products stocks

我希望在我的电子商店中使用事务和/或锁定表,主要是为了避免订单id重复(它不仅仅是自动增量id)

现在我有了这个场景:

1) cart submitted by user
2) check if all informations are correcly filled
3) lock tables with products, orders and discount cupons
4) begin transaction
-- try { --
5) update products stocks
6) mark discount cupon as used
7) get order-id (it is based on number of orders today)
8) save order
-- } catch { --
9a) rollback transaction
10a) unlock tables
-- } --
9b) commit transaction
10b) unlock tables
11) send mail and show thankfull message to user
Q1:我想知道这种情况是“正确的”还是有更好的方法

Q2:使用事务时是否需要锁定表?除了不让订单id重复外,我希望尽可能少地影响电子商店的用户和管理员。我决定使用transaction,因为它使数据保持一致——例如,当产品库存更新但保存订单失败时,最好回滚以前的库存数量


非常感谢各位的评论和建议。

对于每个评论,请移除表锁,否则会很好


您几乎不应该使用显式表锁。当需要时,配置脚本中可能会出现一些边缘情况,但如果您忘记它们的存在,则最好使用其他方法。

无需锁定表,否则可以。事务会锁定正在修改的行。谢谢。请问我什么时候应该使用锁桌?我总是可以在不合适的情况下使用transaction或Where?锁定桌子就像在手术室使用战斧而不是手术刀。有些数据库操作需要它,但是,大多数数据库操作都会隐式锁定表。我真的想不出在数据库正常运行期间使用表锁的任何原因。谢谢您的解释。我想知道的最后一件事是,在第2点和第4点之间有一个非常小的延迟,但确实有。我想100%确定订购的产品有库存,我在第2点中进行了检查。我应该在第2点之前开始交易(所以即时购物车是由用户提交的)还是应该在当前交易中,在第5点之前的某个地方进行另一次检查?在我的情况下,这是一个很小的机会,但更重要的是,我想知道大型电子商店如何处理这一点,如果他们能在一秒钟内有几个订单。当你更新库存水平时,
update qty=qty-purchase。。其中数量>=采购
。然后查看受影响的行,看看是否可以将其删除。如果这些失败,您可以回滚/缺货错误。