實為吾之愚見,望諸君酌之!聞過則喜,與君共勉
現象展示
有時在查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
結論: