压测遇到数据库死锁

https://blog.csdn.net/qq_16605855/article/details/89183976

分析步骤:

现象还原:

1.查看redis死锁日志:show engine innodb status

2.分析死锁日志

3.看压测吞吐是否过大

 

遇到的现象:压测吞吐放的很小还是会出现死锁现象,死锁导致原因是行级锁,压测脚本是设置计数器数据递增到一定量开始重头开始递增数据,比如1-1000递增后又开始从1递增。这个时候如果服务一个线程在处理key 2,第二轮递增开始了,又有一个线程在处理key 2.。那么会出现两个线程同时处理一个数据库key,其中一个已经持有锁了,所以另一个只能等待

就会出现

判断是表锁还是行级锁的方法:

把压测数据设置不重复从头递增,让一直递增一定数量,不重复,如果业务那好出现死锁那就是表锁,如果没出现死锁那说明就是行锁

表锁和行锁的区别:

表锁指的是事务访问锁住了整张表,那么其他请求进来都会出现死锁访问不了 表

 

行锁指是一个事务访问锁住了这一行,也就是这一行的key,那么其他请求访问这个key就会出现死锁

 

这次压测中最后测试是行锁,也就是线程同时操作同一个key产生的,但是生产上不会出现同时对一个key进行操作的情况,而且对于我们现有业务压测造成死锁到 死锁释放时间很短,不会对压测性能结果造成太大影响,所以在我们这个业务压测场景下我们选择了忽略这个死锁现象

注:insert,updata,delete在压测脚本会出现重复数据时,并且服务多线程处理,那么就会出现死锁的现象,比如线程1在insert   key1,线程2在delete key1,那么线程1占有锁还没释放,线程2delete锁就会出现死锁现象,但就我们的业务来说不会在添加冰箱的同时删除冰箱

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章