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