多線程批量新增更新死鎖場景 (結(jié)論:批量更新建議使用id進行更新)
共有10個線程铸董,每次處理200個數(shù)據(jù)
表中有一個主鍵联四,和普通索引。
- 場景1
多線程進行新增和更新操作,更新時通過普通索引鍵進行更新
結(jié)論:發(fā)生死鎖
- 場景2
多線程進行新增和更新操作剃诅,更新時通過主鍵進行更新
結(jié)論:不會死鎖
- 場景3
多線程進行新增或多線程進行更新操作。
結(jié)論:不會死鎖驶忌。
多線程批量新增死鎖場景矛辕;
共有10個線程,每個線程一次新增200條數(shù)據(jù)付魔。
場景1
表中有一個主鍵和一些普通二級索引(非唯一索引).
主鍵值為雪花算法生成聊品,每次生成的值,一定是表里最大值几苍。
結(jié)論:不會死鎖場景2
表中有一個主鍵和一些普通二級索引(非唯一索引).
主鍵值為其他方式生成杨刨,且每次生成的值,隨機分布在表中id的任意區(qū)間擦剑。
結(jié)論:主鍵死鎖
場景3
表中有一個主鍵和一個唯一索引
主鍵值為雪花算法生成妖胀,且每次生成的值,一定是表里最大值惠勒。
唯一索引字段值為其他方式生成赚抡,且每次生成的值,隨機分布在表中此字段的任意區(qū)間
結(jié)論:唯一索引字段死鎖原因纠屋;結(jié)論待驗證
某一Thread優(yōu)先執(zhí)行insert涂臣,由于存在唯一字段,需要校驗唯一性,需要先加鎖(防止值發(fā)生變更)赁遗,加鎖時署辉,如果能找到該索引值,就加記錄鎖(只鎖定此索引)岩四,若不能找到哭尝,則鎖定最近的兩個索引區(qū)間。
場景2/3剖煌,每次insert會有200條數(shù)據(jù)材鹦,最多可能會鎖住200個區(qū)間,多個事務(wù)就可能存在死鎖沖突耕姊。
場景1桶唐,每次insert第一次掃描的區(qū)間一定是:表中最大值的索引->無窮大。也就防止了其他事務(wù)加鎖的可能性茉兰。