关于数据库事物隔离级别的问题

关于下单时候的库存判断 有两个疑问:
一、需要做数据库或者laravel层面的额外配置吗?
二、如果不需要它是怎么处理脏读 重复读 幻读之类的问题的?

感谢大佬帮忙解答~~

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
leo
最佳答案

innodb 默认隔离级别是可重复读,课程中代码扣减库存时使用了事务,因此当两个下单请求几乎同时对同一个 SKU 进行减库存操作时,第二个请求在执行 update product_skus set stock=stock-1 where stock >= 1 and id={id} 这条 SQL 时会被锁住,直到第一个请求提交或者回滚事务,所以不存在问题。

5年前 评论
讨论数量: 4
leo

innodb 默认隔离级别是可重复读,课程中代码扣减库存时使用了事务,因此当两个下单请求几乎同时对同一个 SKU 进行减库存操作时,第二个请求在执行 update product_skus set stock=stock-1 where stock >= 1 and id={id} 这条 SQL 时会被锁住,直到第一个请求提交或者回滚事务,所以不存在问题。

5年前 评论

第一个问题,不需要额外的配置.
关于处理脏读的这一系列问题,推介你看一下mysql内幕这书,laravel只是一个web框架,这些是数据库的问题

5年前 评论
leo

innodb 默认隔离级别是可重复读,课程中代码扣减库存时使用了事务,因此当两个下单请求几乎同时对同一个 SKU 进行减库存操作时,第二个请求在执行 update product_skus set stock=stock-1 where stock >= 1 and id={id} 这条 SQL 时会被锁住,直到第一个请求提交或者回滚事务,所以不存在问题。

5年前 评论

@leo 大佬我想问一下,当两个下单请求几乎同时对同一个SKU进行减库存操作的时候,因为默认的隔离级别是可重复读,那这两个队列同时执行select操作时查到的数据是相同的,即使update操作是第一个事务执行完毕后第二个事务才进行的操作,但是查到的数据是相同的,比如查到的数据都是5,然后都执行update操作,不就都变成4了吗,会有这种情况吗

4年前 评论
leo

@夏天 不会,因为 stock=stock-1

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!