实为吾之愚见,望诸君酌之!闻过则喜,与君共勉
现象展示
有时在查slow log的信息时,可能会遇到,下面这种情况:
上面的信息,都出现了lock_time的时间很长的情况,并且sql的执行时间(query_time)也会出现时间很长的情况
问题复现
现象1:无自建主键的锁等待
无自建主键测试数据,locking Reads的结果和执行时间:
上图可以大概判断,select count(1) from MOCK_DATA for update;的执行时间一般会大于小于15S且大于5S
测试1::设置long_query_time为15s:
等待一段时间后Session1回滚(不要超过锁等待超时时间)
没有看到session2执行的for update操作的sql
测试2:设置long_query_time为5s
等待一段时间后Session1回滚(不要超过锁等待超时时间)
从上图可以看到,session2执行的for update操作的sql记录下来了,其中执行时间(query_time)是47s,在这47s里,锁定的时间(lock_time)是38s
结论:
现象2:有自建主键的锁等待
有自建主键测试数据,locking Reads的结果和执行时间:
上图可以大概判断,select count(1) from MOCK_DATA where id<10000000 lock in share mode;的执行时间一般会大于小于15S且大于5S,
测试1::设置long_query_time为15s:
等待一段时间后Session1回滚(不要超过锁等待超时时间)
没有看到最新测试的session2执行的for update操作的sql,只有之前测试的那条记录
测试2:设置long_query_time为5s
等待一段时间后Session1回滚(不要超过锁等待超时时间)
Session2执行完成,执行时间是1min 0.40sec
从上图可以看到,最新测试的session2执行的for update操作的sql记录下来了,其中执行时间(query_time)是1分钟,在这1分钟里,锁定的时间(lock_time)是51s
结论:
现象3:secondary index的锁等待
Secondary index测试数据,locking Reads的结果和执行时间:
上图可以大概判断,select count(1) from MOCK_DATA where ram_num=7 for update;的执行时间一般会大于小于10S且大于1S,
测试1::设置long_query_time为10s:
等待一段时间后Session1回滚(不要超过锁等待超时时间)
Session2执行完成,执行时间是1min 44.02sec
没有看到最新测试的session2执行的for update操作的sql,只有之前测试的那条记录
测试2:设置long_query_time为1s
等待一段时间后Session1回滚(不要超过锁等待超时时间)
Session2执行完成,执行时间是1min 6.66sec
结论: