一、兩段鎖協(xié)議
在InnoDB事務(wù)中,行鎖是需要的時(shí)候才加上脂崔,并不是不需要就釋放,要等到事務(wù)結(jié)束(commit)后才釋放梧喷,這就是兩段鎖協(xié)議砌左。
小技巧
如果在一個(gè)事務(wù)中要鎖住多個(gè)行,盡量把操作多的行往后放铺敌,這樣就能在一定程度上提高效率汇歹。
二、死鎖和死鎖檢測
死鎖的時(shí)候有兩個(gè)解決方案:
一種方案是直接等待直到超時(shí)偿凭,參數(shù)設(shè)置是innodb_lock_wait_timeout产弹,但是設(shè)置過長的超時(shí)時(shí)間會(huì)影響客戶體驗(yàn),設(shè)置過短又會(huì)影響業(yè)務(wù);
另一種方案是發(fā)生死鎖后主動(dòng)回滾事務(wù)弯囊,設(shè)置參數(shù)innodb_deadlock_detect為on痰哨,但是這種設(shè)置在多個(gè)事務(wù)死鎖后會(huì)占用cpu。
1.更好的解決死鎖的方案?
(1)架構(gòu)師在能改動(dòng)mysql源碼的情況下匾嘱,對于相同行的更新進(jìn)行排隊(duì)(2)優(yōu)化思路是在改動(dòng)頻繁行進(jìn)行分行斤斧,比如把一行改成10行,這樣發(fā)生沖突的概率會(huì)變成之前的十分之一霎烙,但是對于金額表要考慮當(dāng)某行變成0時(shí)要做特殊處理撬讽。
三、思考題
如果要?jiǎng)h除表中的1000條數(shù)據(jù)悬垃,有下列三種解決方案游昼,你會(huì)選擇哪一種?
第一種尝蠕,直接執(zhí)行 delete from T limit 10000;
第二種酱床,在一個(gè)連接中循環(huán)執(zhí)行 20 次 delete from T limit 500;
第三種,在 20 個(gè)連接中同時(shí)執(zhí)行 delete from T limit 500趟佃。