mysql在InnoDB引擎中的锁
源问题 : 有懂秒杀的兄弟吗?为什么 mysql 这样会出现超卖的问题
锁的隔离级别分为四种
- 未提交读
- 提交读
- 可重复读:Innodb默认级别
- 可串行化
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并发也没有出现超售现象