投影片~~~~~~
ChatGPT:
更新庫存是一個熱點操作,容易產生行級鎖,而插入購買記錄的行為則不會產生行級鎖。為了避免重複秒殺帶來的不必要的庫存更新操作和減少行級鎖的佔用,可以先插入購買明細,然後再進行庫存的更新。
在程式碼中,根據熱點商品競爭的結果,可以根據判斷來決定下一步是回滾(rollback)還是提交(commit)事務。這樣做的好處是可以降低網絡延遲和垃圾回收(GC)對系統的影響,節省了一部分時間。
將插入操作放在前面的原因是,插入操作組成了一個元件,包含秒殺單的資訊、使用者ID和電話等,這個元件的衝突機率並不高。因此,可以平行執行插入操作,網絡延遲和GC的影響可以並行進行。之後再執行更新庫存的操作,這時候需要處理行級鎖(rowLock)。
行級鎖(rowLock)是最小粒度的鎖,並行度最高,但加鎖的過程比較慢。
總的來說,以上策略的最終目的是為了降低MySQL行級鎖的持有時間,以提高系統的並行度和效率。需要根據具體情況和需求來選擇最佳的策略,並進行性能測試和優化。
简单优化:
更新库存的是热点操作,会出现行级锁,而插入购买记录的行为没有行级锁。可以先插入购买明细,可以避免因重复秒杀带来的不必要的更新库存操作,减少不必要的行级锁的占用。然后再去更新库存。代码中,根据热点商品竞争的结果,来决定下一步是rollback还是commit,降低了网络延迟和GC影响一半的时间
插入操作放在前面,插入操作就是把秒杀单,用户id,电话组成一个组件,这个组件冲突的概率并不是很高,因为秒杀单在前头,还有用户的电话,组成一个唯一键,这个时候的网络延迟和GC是可以并行的,这个时候再去拿update减库存的rowLocl行级锁
rowLock: 行级锁,锁的粒度最小,并发度最高,加锁慢
最终目的:降低MySQL roollock的持有时间
回顾事务执行
秒杀操作通过mysql的事务来完成。
当mysql执行update会获得行级锁,所以将insert语句调到update语句的前面,减少其获得行级锁的时间,来达到并发优化
代码调整,先insert后update,减少获取rowlock的时间,优化性能
该节视频涉及到sql优化
业务逻辑层面的优化,将用户的每次购买记录到 insert 到数据库的操作提前到减库存之前;
并获得返回值 insertCount ,其代表当前用户执行了一次秒杀操作;
当用户在前端页面重复点击多次购买时,该 insertCount> 0时则说明当前用户已购买,不再进入到下一步的减库存操作;
从而避免了行级锁频繁无功用访问执行时带来的效率问题;
最后,如果insertCount <=0时,允许进入到减库存的操作。
先insert,后update,减少锁的持有时间
insert ignore 主键冲突返回0
1.为什么insert插入成功 update失败事务依然会回滚成功?
只有在commit的时候 内部逻辑才被"真正"执行 映射到表里 没commit之前所有操作都在内存执行
2.为什么 insert在前能够减少锁的持有时间?
首先是在更新操作的时候给行加锁,插入并不会加锁,如果更新操作在前,那么就需要执行完更新和插入以后事务提交或回滚才释放锁,而如果插入在前,则更新完以后事务提交或回滚就释放锁。也就是说是更新在前加锁和释放锁之间两次的网络延迟和GC,如果插入在前则加锁和释放锁之间只有一次的网络延迟和GC,也就是减少的持有锁的时间。
改变insert, update顺序,先update,后insert,降低mysql rowLock的持久时间
回顾事务执行
秒杀操作通过mysql的事务来完成。
秒杀操作的简单优化:更新库存的是热点操作,会出现行级锁,而插入购买记录的行为没有行级锁。可以先插入购买明细,可以避免因重复秒杀带来的不必要的更新库存操作,减少不必要的行级锁的占用。然后再去更新库存。这样,行级锁的占用时间可以节省一半(反正是节省了)
rowLock: 行级锁,锁的粒度最小,并发度最高,加锁慢
秒杀操作的简单优化:更新库存的是热点操作,会出现行级锁,而插入购买记录的行为没有行级锁。可以先插入购买明细,可以避免因重复秒杀带来的不必要的更新库存操作,减少不必要的行级锁的占用。然后再去更新库存。这样,行级锁的占用时间可以节省一半(反正是节省了)
秒杀操作瓶颈分析
插入操作放在前面,插入操作就是把秒杀单,用户id,电话组成一个组件,这个组件冲突的概率并不是很高,因为秒杀单在前头,还有用户的电话,组成一个唯一键,这个时候的网络延迟和GC是可以并行的,这个时候再去拿update减库存的rowLocl行级锁
啊啊啊啊啊
结果提交了,锁就结束了网络延迟影响就没多大影响了
换顺序了,sql就放在mysql里面执行,mysql只要告诉我结果就可以了,就可以忽略网络延迟的影响了。
先买后减库存
行级锁优化
降低rowlock的持有时间