mysql 行级锁问题

线上碰到存储过程死锁问题了,开始觉得非主键查询 for update 会致使表锁,后来通过测试 innodb下for update索引生效的状况下 根据索引字段查询是行级锁,会将整个结果集进行上锁,直到事务结束。 node

错误地方进行一些修正,通常状况的确是将索引的结果集进行上锁,可是因为表过大的状况,mysql为了性能自动优化将索引附近的结果集所有进行上锁。mysql

具体实验过程能够看https://blog.csdn.net/qq_31975227/article/details/103710018,本身作一遍也能实验出来。sql

可是存储过程死锁的问题仍是没有解决,不过该存储过程只是进行内存统计数据的落库,因此不该该上锁。虽然程序是node调用,可是也不会出现执行顺序问题,若是出现了执行顺序问题加了行级锁也是没有用的,又不是在源数据进行加减等计算操做,计算操做都在内存完成了,最后只进行了落库操做。(来至我的的吐槽,我没办法说法领导,后来和领导沟通说明白了问题)数据库

 

 

死锁的问题经过分析死锁日志文件解决了,因为上面一块错误的认识。一直认为两个非惟一索引能够命中单条记录,其实mysql为了性能命中了多条。性能

一个简单的update语句,update ? where  id1=1 and id2=2 id1和id2 都是非惟一索引,这时有的语句会对由于优化致使上锁其余索引周边的数据条目,这时他会等待内建惟一索引的锁,而一样的语句会对内建惟一索引加锁,等待id1 或者id2的锁,出现同一条语句回环等待锁的释放,致使死锁发生。测试

之后仍是须要多看一些数据库方面的书籍,对原理性知识了解的更多一些。优化

相关文章
相关标签/搜索