怎么减少行锁对性能的影响()
1)MyISAM 被 InnoDB 替代的重要原因之一是什么?
- MyISAM 引擎就不支持行锁,只能使用表锁,同一张表上任何时刻只能有一个更新在执行,影响到业务并发度。
- InnoDB 是支持行锁的。
- 【怎么减少行锁对性能的影响()】在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放
- 如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放
- 买电影票业务,我们应该把影院账户余额增加这个语句放在最后,因为可能有很多的用户在同时买票。不要因为事务占有锁而影响我们其他的人买票,降低系统的并发度。
- 发生死锁
文章图片
6)MYSQL中死锁的解决策略?
- 一种策略是,直接进入等待,直到超时。这个超时时间可以通过参数 innodb_lock_wait_timeout 来设置。
- 另一种策略是,发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数 innodb_deadlock_detect 设置为 on(默认值就是on),表示开启这个逻辑。
- 50s
- 如果真的出现死锁的话那还好说,万一只是简单的等待那就造成误伤了。
- 选择上面6)的第二种,主动死锁检测
- 主动检测的业务:每当一个事务被锁的时候,就要看看它所依赖的线程有没有被别人锁住,如此循环,最后判断是否出现了循环等待,也就是死锁。
- 假设有 1000 个并发线程要同时更新同一行,那么死锁检测操作就是 100 万这个量级的。最终没有死锁的话消耗大量的CPU资源,表面上看上去cpu很忙,但是缺没干了几件正事。
- 就是如果你能确保这个业务一定不会出现死锁,可以临时把死锁检测关掉。
- 另一个思路是控制并发度,并且这个并发控制要做在数据库服务端。因为客户端有很多。
- 如果你有中间件,可以考虑在中间件实现;如果你的团队有能修改 MySQL 源码的人,也可以做在 MySQL 里面。基本思路就是,对于相同行的更新,在进入引擎之前排队。这样在 InnoDB 内部就不会有大量的死锁检测工作了。
- 将一行改成逻辑上的多行来减少锁冲突。以影院账户为例,可以考虑放在多条记录上,比如 10 个记录,影院的账户总额等于这 10 个记录的值的总和,每次要增加金额随便选一条就行。
- 这类方案需要根据业务逻辑做详细设计,退票的时候当一部分行记录变成 0 的时候,代码要有特殊处理。
推荐阅读
- java测试代码_怎么写Java测试代码?
- 简洁的表白java_java简短表白代码怎么写(实操讲解)
- python挂机脚本怎么运行,Python实现自动挂机脚本(基础篇)
- 餐饮小程序怎么做
- 这是怎么了
- 静不下心学习却还要强迫自己学习时怎么办
- 中小企业想要利用互联网霸屏来打造品牌知名度该怎么做()
- 神兽在家,怎么把生活过得有意思()
- 94年,初中毕业,月薪2000,没有文凭的90后是怎么过的()
- (短篇)余下的日子我该怎么过(06)