相关疑难解决方法(0)

如何正确使用事务和锁来确保数据库完整性?

我开发了一个在线预订系统.为了简化,假设用户可以预订多个项目,每个项目只能预订一次.物品首先被添加到购物车.

应用程序MySql/ InnoDB数据库.根据MySql文档,默认隔离级别是Repeatable reads.

这是我到目前为止提出的结账程序:

  1. 开始交易
  2. 选择购物车中的项目(带for update锁定)在此步骤中提取
    记录cart-itemitems表格.
  3. 检查项目是否未被其他人预订
    基本上检查是否quantity > 0.它在实际应用中更复杂,因此我把它作为一个单独的步骤.
  4. 更新项目,设置quantity = 0
    还执行其他重要的数据库操作.
  5. 付款(通过PayPal或Stripe等外部API)
    无需用户交互,因为可以在结账前收集付款细节.
  6. 如果一切正常提交事务或回滚否则
  7. 继续使用非必要逻辑
    发送电子邮件等以防成功,重定向错误.

我不确定这是否足够.我担心是否:

  1. 尝试同时预订同一项目的其他用户将被正确处理.他的交易会T2等到T1完成吗?
  2. 使用PayPal或Stripe付款可能需要一些时间.这不会成为性能方面的问题吗?
  3. 项目可用性将始终正确显示(项目应该可用,直到结帐成功).这些只读选择是否应该使用shared lock
  4. MySql可能会自行回滚事务吗?通常更好的方法是自动重试或显示错误消息并让用户再试一次?
  5. 如果我SELECT ... FOR UPDATEitems桌上做的话,我想它就足够了.这样,双击和其他用户引起的请求都必须等到事务完成.他们会等待,因为他们也会使用FOR UPDATE.同时vanilla SELECT会在交易前看到db的快照,但没有延迟,对吗?
  6. 如果我使用JOINSELECT ... FOR UPDATE,将两个表中的记录被锁定?
  7. 我对Willem Renzema回答的不存在的行部分的SELECT ... …

mysql database concurrency locking transactions

6
推荐指数
2
解决办法
3836
查看次数

标签 统计

concurrency ×1

database ×1

locking ×1

mysql ×1

transactions ×1