一点并发安全的疑惑
网上都认为update t_goods set stock=stock-1 where id=1 and stock>0;能解决超卖问题,但都没有说明其原理,比如innodb的锁机制此时如何,只说了保证了原子性,难道原子性就能保证并发安全了吗?我觉得不对吧,网上很多资料讲锁机制都是使用了如select for update 等显式的命令,或者就是看得晕乎乎,我询问chatgpt的时候它回答仍可能出现超卖,它说两个事务同时查询where所在处,都发现条件符合,都执行更新操作,它认为排它锁是在更新的操作中加的,即锁的延迟获取,所以什么是对的
全部评论
1、本来先select再update的两个sql现在变成一条sql了,保证了原子性 2、这里用的是乐观锁思想 即stock大于0才更新 但实际上对于数据库层面用了update在默认隔离级别下 加了写锁 即还是加了悲观锁 所以我认为是并发安全的
相关推荐