MySql中的锁

行锁

InnoDB 的行锁

两阶段锁

在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。

如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。

这样可以提高事务的并发程度

死锁和死锁检测

当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就
会导致这几个线程都进入无限等待的状态,称为死锁。

事务之间相互等待,这时就可能会发生死锁

死锁的两种策略

一:innodb_lock_wait_timeout 设置事务的等待时间 默认是50

二:innodb_deadlock_detect on 表示主动回滚死锁链中的某一条事务

正常情况下还是要采用第二种

如果每个新进来的线程都需要判断是不是由于自己的加入导致了死锁,这是一个时间复杂度为O(n)的操作

热点行更新导致的性能问题

一:头痛医头的方法,就是如果你能确保这个业务一定不会出现死锁,可以临时把死锁检
测关掉,这个操作具有一定的风险

二:控制并发度

​ 客户端控制并发度:如果客户端很多,这种办法也是不可取的。应该在数据库进行并发度的控制

​ 修改源码:在进入引擎之前排队。

三:从设计上优化这个问题

小结

这里的原则 :如果你的事务中需要锁多个行,要把最可能造成锁冲突、
最可能影响并发度的锁的申请时机尽量往后放

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值