源问题 : 有懂秒杀的兄弟吗?为什么 mysql 这样会出现超卖的问题
Innodb默认情况下是开启了自动事务。
幻读和脏读的区别: 幻读侧重于新增和删除(同一事务中读取的数据不一致),脏读倾向于数据
Innodb通过多版本并发控制解决幻读的问题。
update
语句条件中在有id情况和没id的情况下,锁级别不一样,有id是行锁,没id是表锁。
效率方面,在mysql条件中进行计算会导致索引失效。
for i := 0;i<300;i++{
i := i
go func(i int){
if err := model.UpdateTest();err != nil{
fmt.Println(err)
}
fmt.Println("current num:" + strconv.Itoa(i))
}(i)
}
time.Sleep(time.Second*5)
func UpdateTest() error{
return DB.Self.Exec("update class set num = num -1 where id = 1 and (num -1 ) >= 0").Error
}
最后,简单在demo用go开300并发也没有出现超售现象
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有