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源码或者中间件。 可以考虑将一行改成逻辑上的多行减少锁冲突。