mysql行級鎖和表級鎖的區別?
1.程序中的非數據庫交互導致事務掛起。
在SQL事務代碼中嵌入接口調用或文件操作等非數據庫交互操作,可能會導致整個事務掛起(接口被阻塞,等待超時或上傳下載大附件)。
2.該事務包含性能不佳的查詢SQL
事務中有一個慢速查詢,導致同一個事務中的其他DML無法及時釋放被占用的行鎖,導致行鎖等待。
3.單個事務包含大量SQL。
這通常是由于在事務代碼中添加了一個for循環造成的。雖然單個SQL運行速度很快,但是當SQL數量很大時,事務會很慢。
4.級聯更新SQL需要很長時間來執行。
這種SQL很容易給人錯覺。例如,級聯更新如更新一個集合...where(selectB)不僅會占用表A上的行鎖,還會占用表B上的行鎖,當SQL長時間執行時,很容易導致表B上的行鎖等待。
5.由于磁盤問題,交易暫停
在極少數情況下,比如存儲突然下線,SQL執行會卡在內核調用磁盤這一步,無法提交事務。
綜上所述,可以看出,如果長時間不提交事務,并且事務中包含DML操作,可能會有行鎖等待,從而導致錯誤。
mysql寫鎖的原理?
一、鎖的概念
鎖是計算機協調多個進程或線程并發訪問資源的一種機制。
二、MySQL中的鎖
表級鎖定:低開銷和快速鎖定;不會出現僵局;鎖粒度大,鎖的概率最高,并發性最低。
行級鎖定:開銷大,鎖定慢;將出現死鎖;鎖粒度最小,鎖概率最低,并發性最高。
頁鎖:開銷和鎖時間介于表鎖和行鎖之間;將出現死鎖;鎖定粒度介于表鎖和行鎖之間,并發性一般。
第三,米沙姆s寫鎖定
1.鎖表testmysam寫
在同一屆會議上
插入testmysam值(3)
從testmysam中刪除,其中id3
select*fromtestmysam
2.在不同的表上操作(報告錯誤)
從testmysams中選擇s.*
插入到testdemo值(2,#392#39,#393#39)
3.在其他會話中(等待)
select*fromtestmysam