我有一个我刚刚建立的网上商店,我一直在产品库存表上使用LOCK TABLES以确保库存不低于0或未正确更新。
最近,数据库上出现了大量流量和大量操作(还有一些其他LOCK TABLES),因此我一直在问自己是否有更快更安全的方法来保持数据的一致性。
我正在尝试了解交易及其运作方式,我想知道以下逻辑是否会成功应用于我的结帐流程:
1)START TRANSACTION(以便任何后续查询可以回滚,如果其中一个失败或其他条件如库存低于需要)
2)将客户插入“客户”表
3)在'orders'表中插入订单信息
4)对不同表格的类似查询
5)购物车中的每件商品:
5.1)更新产品设置库存=库存 - x库存 - x> = 0(x是客户想要购买的任何单位)
5.2)检查受影响的行,如果受影响的行== 0则ROLLBACK并退出(当前产品库存不足,因此取消订单/抛出错误)
5.3)其他一些查询......等等。
6)COMMIT
这听起来不错吗?
我没有得到(并且不知道我是否应该首先关注)是'产品'表和股票数字会发生什么,如果某些并发会话(另一个客户)试图放置相同的订单或包含一些相同产品的订单。
第二笔交易是否会等待第一笔交易完成,第二笔交易是否会使用最新的股票数据,或者它们是否会同时运行,在某些情况下可能都会失败或者是什么?
答案 0 :(得分:2)
您的工作流程是正确的,即使我会从交易中取出第2步(保存客户的详细信息):您可能想要记住您的客户,即使订单无法下达。
当在事务中更新行时,该行(或在某些不幸的情况下,整个表)将以独占模式锁定,直到事务结束。在尝试更新库存时,同时尝试对同一产品下订单将被搁置。
当第一个事务被提交(或回滚)时,锁被释放,并发更新将更新新值。
推荐阅读:this manual chapter,完整,this page。是的,这很多(但如果你一开始并不了解所有内容,请不要担心 - 兔子洞非常,非常深)