這篇文章主要介紹“MySQL死鎖問題實例分析”,在日常操作中,相信很多人在mysql死鎖問題實例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”mysql死鎖問題實例分析”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
創(chuàng)新互聯(lián)建站于2013年開始,先為江陽等服務(wù)建站,江陽等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為江陽企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
一、問題描述:
一張表的非索引字段更新,并發(fā)環(huán)境下出現(xiàn)鎖表,導(dǎo)致死鎖!
二、簡要分析:
兩個事務(wù),一個事務(wù),在執(zhí)行一個索引字段更新sql,另外一個事務(wù)正好進行主鍵條件更新,也進行非索引更新。導(dǎo)致兩個事務(wù)交叉等待釋放鎖,所以出現(xiàn)死鎖問題。
三、數(shù)據(jù)模擬:
創(chuàng)建表:
create table user(
id int(10) NOT NULL AUTO_INCREMENT,
user_id varchar(20),
id_card_no varchar(50),
name varchar(30),
password varchar(30),
sex char(1),
birthday date,
PRIMARY KEY (`id`),
INDEX index_name (user_id(20))
);
插入兩條數(shù)據(jù)
insert into user (user_id,id_card_no,name,password,sex,birthday) values('000001','001','zhangsan','123','t','1993-05-27');
insert into user (user_id,id_card_no,name,password,sex,birthday) values('000002','002','lisi','123','t','1993-05-27');
四、問題復(fù)現(xiàn)
step 1:開啟一個事務(wù)1,首先執(zhí)行主鍵更新
begin;
update user set name = "test transaction by zz" where id = 1;
step 2:再開啟一個事務(wù)2,執(zhí)行另一個主鍵更新語句,
begin;
update user set name = "test transaction by zz" where id = 2;
step 3:事務(wù)1執(zhí)行一條非索引字段更新,不要提交事務(wù);
update user set name = "test transaction by zz name" where user_id = '000001';
step 4:事務(wù)2在執(zhí)行一條非索引字段更新,不要提交事務(wù);
update user set name = "test transaction by zz name" where user_id = '000002';
運行結(jié)果:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction.
四、分析結(jié)果:
1.兩個事務(wù),交叉等待對方釋放鎖,就會出現(xiàn)死鎖。
2.如上操作,事務(wù)1執(zhí)行sql2的時候等待事務(wù)2釋放行鎖,事務(wù)2這時候可能也進行非索引字段更新,需要等待事務(wù)1釋放表鎖,這就出現(xiàn)了死鎖。
3.主鍵更新,只會鎖住該索引,這就是行級鎖的概念;索引字段更新或者刪除,會先根據(jù)索引字段,找到相應(yīng)的主鍵記錄,再進行加鎖;非主鍵,非索引字段的更新和刪除默認會鎖住整張表,這就是一個表級鎖的概念;
五、優(yōu)化與建議:
1.避免非索引字段的更新和刪除操作。
2.如果有這樣的更新,建議事務(wù)外查詢,然后根據(jù)索引字段進行更新,就不會造成鎖表的情況;
3.對相應(yīng)的字段加索引,但是一張表中索引不宜太多,會影響數(shù)據(jù)庫性能,最好四個以內(nèi),對于超過100ms的查詢,需要優(yōu)化;但是加索引也不是最好的解決方案,索引更新,也會先找到索引對應(yīng)的主鍵,再進行加鎖,也有一點點性能問題。但是滿足大部分的業(yè)務(wù)需求。
4.系統(tǒng)需要異常情況要有重試機制,對于數(shù)據(jù)庫這樣的,死鎖問題,一般的在并發(fā)下出現(xiàn),也是會有系統(tǒng)空缺的時候,這時候有重試,就稍微好一點。但是對于時效性比較高的業(yè)務(wù),一定不能出現(xiàn)這種問題。
到此,關(guān)于“mysql死鎖問題實例分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
本文標(biāo)題:mysql死鎖問題實例分析
本文網(wǎng)址:http://jinyejixie.com/article4/jjphoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)站設(shè)計、虛擬主機、網(wǎng)頁設(shè)計公司、動態(tài)網(wǎng)站、用戶體驗
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)