概念:当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态,称为死锁。
出现死锁以后,两种策略:
innodb_lock_wait_timeout
来设置,在innodb中默认值是50s。innodb_deadlock_detect
设置为on,表示开启这个逻辑。正常情况下采用第二种策略:主动死锁检测。但是需要注意一些特殊场景。
每当一个事务被锁的时候,就要看看它所依赖的线程有没有被别的线程锁住,如此循环,最后判断是否出现了死锁。
每个新的被堵住的线程,都要判断会不会由于自己的加入导致了死锁,这是一个时间复杂度是O(n)的操作,假设有1000个并发线程要同时更新同一行,那么死锁检测操作就是100万量级,虽然最终检测结构可能是没有死锁,但是这期间要消耗大量的CPU资源,这时就会看到CPU利用率很高,但是每秒执行不了几个事务。
怎么解决由热点行更新导致的性能问题?
方案一:
方案二:
方案三:
null
值判断,否则将导致引擎放弃使用索引而进行全表扫描。!=
或者<>
操作符