我开发了一个在线预订系统.为了简化,假设用户可以预订多个项目,每个项目只能预订一次.物品首先被添加到购物车.
应用程序MySql/ InnoDB数据库.根据MySql文档,默认隔离级别是Repeatable reads.
这是我到目前为止提出的结账程序:
- 开始交易
- 选择购物车中的项目(带
for update锁定)在此步骤中提取
记录cart-item和items表格.- 检查项目是否未被其他人预订
基本上检查是否quantity > 0.它在实际应用中更复杂,因此我把它作为一个单独的步骤.- 更新项目,设置
quantity = 0
还执行其他重要的数据库操作.- 付款(通过PayPal或Stripe等外部API)
无需用户交互,因为可以在结账前收集付款细节.- 如果一切正常提交事务或回滚否则
- 继续使用非必要逻辑
发送电子邮件等以防成功,重定向错误.
我不确定这是否足够.我担心是否:
T2等到T1完成吗?shared lock?SELECT ... FOR UPDATE在items桌上做的话,我想它就足够了.这样,双击和其他用户引起的请求都必须等到事务完成.他们会等待,因为他们也会使用FOR UPDATE.同时vanilla SELECT会在交易前看到db的快照,但没有延迟,对吗?JOIN的SELECT ... FOR UPDATE,将两个表中的记录被锁定?