秒杀的高并发分析 insert和update为什么要颠倒过来

来源:3-1 秒杀操作-并发优化-1

慕粉18810003712

2017-06-20 10:02

我知道使用为了优化,但是不知道为什么。

写回答 关注

3回答

  • kevinyangit
    2017-06-21 13:04:32
    已采纳

    原来执行的流程

    update(发送在mysql网络时间+gc时间) + insert(发送在mysql网络时间+gc时间)

    因为update同一行会导致行级锁,而insert是可以并行执行的。

    1.如果先update, update在前面会加锁

    锁 + update(发送在mysql网络时间+gc时间) + insert(发送在mysql网络时间+gc时间) + 提交锁

    其实的线程就要等,这个锁提交才能执行。

    2.如果先insert,

    insert(发送在mysql网络时间+gc时间) +  锁+ update(发送在mysql网络时间+gc时间) + 提交锁

    其实的线程可以并发insert. 这样子会减少锁的时长



    慕村8951...

    你的意思也就是说 比如 A B C D E F...这些比如他们都是一个线程 A线程 去执行 insert +update 然后后面的线程比如b 他可以在前面那个线程A在阻塞update时候 就可以在这个堵塞时间把insert执行完毕 相当于省去了insert 只有update , 如何是先update 就会在此堵塞 完成insert操作 commit/rollback 我理解对吗

    2018-01-16 09:52:51

    共 2 条回复 >

  • Sonihr
    2019-03-14 22:24:37

    https://blog.csdn.net/and1kaney/article/details/51214001

    看场景二。

    insert是会加锁的,但是这个锁不影响同时插入。什么叫并发?并发指的是多线程对统一资源进行争夺。但是当我们对同一张表中并发写入的时候,对什么资源进行争夺了呢?从场景2中可以很明显的看出,当有两个事物都在insert的时候,在commit之前都可以插入。

    好的,那解释一下为什么insert要放在update之前:

    1.因为insert的通过用户id+商品id作为联合主键,因此实际上插入操作是可以并行的。2.如果某个用户多次刷新提交数据,都会被判定为是无效数据,无需update。

  • qq_Sebtimental丶_23564747
    2018-07-29 17:35:34

    简单来讲就是insert在后面的话就会等锁竞争,放到前面了insert就可以并行执行了,当中就少了insert占用的时间了,放后面会等两个锁竞争,放前面就等一个锁。

Java高并发秒杀API之高并发优化

Java实现高并发秒杀API的第四门课,小伙伴一定可以从中受益

78600 学习 · 170 问题

查看课程

相似问题