源问题 : 有懂秒杀的兄弟吗?为什么 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并发也没有出现超售现象

标签: none

评论已关闭