我知道使用为了优化,但是不知道为什么。
原来执行的流程
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. 这样子会减少锁的时长
https://blog.csdn.net/and1kaney/article/details/51214001
看场景二。
insert是会加锁的,但是这个锁不影响同时插入。什么叫并发?并发指的是多线程对统一资源进行争夺。但是当我们对同一张表中并发写入的时候,对什么资源进行争夺了呢?从场景2中可以很明显的看出,当有两个事物都在insert的时候,在commit之前都可以插入。
好的,那解释一下为什么insert要放在update之前:
1.因为insert的通过用户id+商品id作为联合主键,因此实际上插入操作是可以并行的。2.如果某个用户多次刷新提交数据,都会被判定为是无效数据,无需update。
简单来讲就是insert在后面的话就会等锁竞争,放到前面了insert就可以并行执行了,当中就少了insert占用的时间了,放后面会等两个锁竞争,放前面就等一个锁。