索引对mysql行锁和表锁影响
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
1、前言
昨天生產(chǎn)環(huán)境遇到了一個比較詭異的問題,project a 調(diào)用 project b webservice,b webservice在做insert操作的時候數(shù)據(jù)庫報如下錯誤。
lock wait timeout exceeded; try restarting transaction?
2、原因分析
從報錯信息分析應(yīng)該是project b在進行insert操作的時候操作的表被鎖住了, project b的所有數(shù)據(jù)庫操作都是在同一事務(wù)上,原則上不會出現(xiàn)鎖表的情況,由此推出應(yīng)該是project a 在調(diào)用project b接口的時候還沒有提交事務(wù),并且對同一張表執(zhí)行了update操作并鎖住了整張表。
3、通過數(shù)據(jù)庫還原整個場景。
相關(guān)表:t_product_base? id,name(未做索引)
第一步:根據(jù)name對product進行update操作
begin; update t_product_base set name = 'fengshuzi' where name = 'fengshuzi'第二步:新開一個事務(wù)進行update操作
begin; update t_product_base set name = '318' where name='317'; commit;第三步:報錯如下
?
4、原因分析
第一步對product表進行update操作暫不提交事務(wù),where條件使用的是name,因為name沒有做索引,此時update操作會鎖住整張表,在第一步的事務(wù)沒有提交之前其他事務(wù)無法對鎖住的表進行update操作只能等待。
如若想要使得以上操作成功需要給name字段加上索引這樣在執(zhí)行第一步的sql的時候mysql鎖住的是name=‘xxx’相關(guān)的行而不是整張表,這樣的話其它事務(wù)可以操作product表的其它行。
?
5、總結(jié)
我們在進行擴項目操作數(shù)據(jù)庫的時候需要特別注意數(shù)據(jù)庫事務(wù)鎖的問題。update操作鎖住的是表還是行關(guān)鍵要看update后面的where字段是否加索引。
?
轉(zhuǎn)載于:https://my.oschina.net/fengshuzi/blog/676642
總結(jié)
以上是生活随笔為你收集整理的索引对mysql行锁和表锁影响的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 删除数据表和清空数据表的内容(保存表结构
- 下一篇: Redis模式匹配删除key