Mysql中的行锁

1.两阶段锁

A: update t set k=k+1 where id=1  update t set k=k+1 where id=2

B: begin update t set k=k+2 where id=1

B必须等到事务A提交之后才能继续执行

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

3. 死锁: A  (1) update t set k=k+1 where id=1    (3) update t set k=k+1 where id=2

                B  (2) update t set k=k+1 where id=2    (4) update t set k=k+1 where id=1

     解决方案: 设置超时时间  innodb_lock_wait_timeout           发起死锁检测,发现死锁主动回滚死锁链条中的某一个事务。让其他事务得以继续执行。innodb_deadlock_detect设置为on, 表示开启。

4.死锁检测:复杂度o(n),1000个并发线程同时更新同一行,死锁检测操作是100万级别。 现象-> 消耗大量CPU资源,每秒执行不了几个事务。

5. 热点行更新导致的性能问题如何解决: 控制并发度 ->  对于相同行的更新,只进入引擎之前排队,这样在innodb内部不会有大量死锁检测。缺点:需要修改MySQL源码或者中间件。  可以考虑将一行改成逻辑上的多行减少锁冲突。

               

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值