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并发也没有出现超售现象