下面是通過錯誤日志捕捉到的死鎖SQL:
150922 18:12:49
事務(wù)1
update g_taskinfo set tislocked=1,tlockperson=13406 where tobjnum2 = 94064033 ?and tislocked = 0
使用到idx_tobjnum2_ttape索引(非主鍵索引)
事務(wù)2
update g_taskinfo set finishtime='2015-09-22 18:12:28', tstatus=20 where id=471791 (使用到主鍵索引)
事務(wù)1 update操作過程
1驾锰、由于使用了非主鍵索引,首先需要獲取idx_tobjnum2_ttape上的行級鎖
2走越、緊接著根據(jù)主鍵進(jìn)行更新椭豫,所以需要獲取主鍵上的行級鎖
3、更新完畢后,提交赏酥,并釋放所有鎖(MySQL鎖一次性釋放)
死鎖產(chǎn)生原因:
高并發(fā)場景下嘹黔,事務(wù)1的步驟1執(zhí)行完后奕纫,鎖住了非主鍵索引老虫,然后去請求主鍵索引更鲁,此時在執(zhí)行完步驟1后,進(jìn)入步驟2之前突然進(jìn)來事務(wù)2呵晨,事務(wù)2會鎖住主鍵索引魏保,然后去請求非主鍵索引idx_tobjnum2_ttape。
由于事務(wù)2獲取了主鍵索引摸屠,在等待idx_tobjnum2_ttape上的鎖谓罗。
事務(wù)1獲取了idx_tobjnum2_ttape鎖,等待主鍵索引上的鎖餐塘。
死鎖發(fā)生妥衣。
解決方法:將事務(wù)1的非主鍵索引,修改為通過主鍵逐一操作