鎖表的問題
innodb鎖表問題
死鎖的形成
向innodb資料表中寫資料死鎖。蒐集資料如下
一、形成死鎖的四個必要條件
(1) 互斥條件:乙個資源每次只能被乙個程序使用。
(2) 請求與保持條件:乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。即a在等待b占有的資源、b在等待c占有資源。。。z在等待a占有的資源。
破壞上面任一條件都可避免死鎖。
發生死鎖後的解決辦法:
1、撤消陷於死鎖的全部程序;
2、逐個撤消陷於死鎖的程序,直到死鎖不存在;
3、從陷於死鎖的程序中逐個強迫放棄所占用的資源,直至死鎖消失。
4、從另外一些程序那裡強行剝奪足夠數量的資源分配給死鎖程序,以解除死鎖狀態
參考 二、innodb行級鎖定原理
搜尋或掃瞄乙個表索引之時,innodb以這樣一種方式實行行級鎖定,它對任何遇到的索引記錄設定共享的或獨佔的鎖定。因此,行級鎖定實際是索引記錄鎖定。
三、所遇到死鎖
5臺伺服器同時以sql語句:
replace into tablename values('tid1','currenttimestamp'...),('tid1','currenttimestamp'...),...('tid1','currenttimestamp'...);#5000條記錄,其中tid1 ,currenttimestamp 聯合索引做主索引
向mysql innodb表寫入資料,報如下錯誤:
deadlock found when trying to get lock; try restarting transaction
四、解決方式
將5000條記錄按主索引tid,currenttime排序後拼成sql語句,這樣可以破壞四條件中的第四個,以避免死鎖。
mysql鎖問題嗎 mysql 鎖問題處理
錯誤資訊如下 time 140122 16 34 23 user host x thread id 19904440 schema x last errno 1205 killed 0 query time 200.911931 lock time 0.000041 rows sent 0 rows...
mysql的行鎖問題
mysql的innodb引擎支援行級鎖和表級索。預設是行級鎖。關於行級鎖具體是什麼時候起作用。我們來 一下。建立乙個測試表 create table test id int 11 not null auto increment,name varchar 20 not null,primary key...
MySQL的鎖問題 1
鎖是我們在計算機中經常用來解決多個程序或執行緒併發訪問臨界資源的一種控制方法。在資料庫中資料也是我們臨界資源的的一種,所以我們要保證在多程序 多執行緒的併發訪問中資料的一致性和有效性。mysql的三種鎖機制 1 表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定粒度大,發生所衝突的概率最高,併發度最低 2 ...