mysql怎么結(jié)束鎖表 mysql數(shù)據(jù)庫鎖表如何解鎖

mysql存儲(chǔ)過程出現(xiàn)鎖表鎖行的情況怎么解決

行鎖的等待

創(chuàng)新互聯(lián)建站專注于香坊網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供香坊營銷型網(wǎng)站建設(shè),香坊網(wǎng)站制作、香坊網(wǎng)頁設(shè)計(jì)、香坊網(wǎng)站官網(wǎng)定制、小程序設(shè)計(jì)服務(wù),打造香坊網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供香坊網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

在介紹如何解決行鎖等待問題前,先簡單介紹下這類問題產(chǎn)生的原因。產(chǎn)生原因簡述:當(dāng)多個(gè)事務(wù)同時(shí)去操作(增刪改)某一行數(shù)據(jù)的時(shí)候,MySQL 為了維護(hù) ACID 特性,就會(huì)用鎖的形式來防止多個(gè)事務(wù)同時(shí)操作某一行數(shù)據(jù),避免數(shù)據(jù)不一致。只有分配到行鎖的事務(wù)才有權(quán)力操作該數(shù)據(jù)行,直到該事務(wù)結(jié)束,才釋放行鎖,而其他沒有分配到行鎖的事務(wù)就會(huì)產(chǎn)生行鎖等待。如果等待時(shí)間超過了配置值(也就是 innodb_lock_wait_timeout 參數(shù)的值,個(gè)人習(xí)慣配置成 5s,MySQL 官方默認(rèn)為 50s),則會(huì)拋出行鎖等待超時(shí)錯(cuò)誤。

如上圖所示,事務(wù) A 與事務(wù) B 同時(shí)會(huì)去 Insert 一條主鍵值為 1 的數(shù)據(jù),由于事務(wù) A 首先獲取了主鍵值為 1 的行鎖,導(dǎo)致事務(wù) B 因無法獲取行鎖而產(chǎn)生等待,等到事務(wù) A 提交后,事務(wù) B 才獲取該行鎖,完成提交。這里強(qiáng)調(diào)的是行鎖的概念,雖然事務(wù) B 重復(fù)插入了主鍵,但是在獲取行鎖之前,事務(wù)一直是處于行鎖等待的狀態(tài),只有獲取行鎖后,才會(huì)報(bào)主鍵沖突的錯(cuò)誤。當(dāng)然這種 Insert 行鎖沖突的問題比較少見,只有在大量并發(fā)插入場景下才會(huì)出現(xiàn),項(xiàng)目上真正常見的是 updatedelete 之間行鎖等待,這里只是用于示例,原理都是相同的。

三、產(chǎn)生的原因根據(jù)我之前接觸到的此類問題,大致可以分為以下幾種原因

Mysql鎖表解鎖

-- 查詢是否鎖表

show OPEN TABLES ;

-- 查詢進(jìn)程

show processlist ;

-- 查詢到相對(duì)應(yīng)的進(jìn)程,然后殺死進(jìn)程

kill id; -- 一般到這一步就解鎖了

-- 查看正在鎖的事務(wù)

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

-- 查看等待鎖的事務(wù)

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

-- 解鎖表

UNLOCK TABLES;

MySQL數(shù)據(jù)庫如何鎖定和解鎖數(shù)據(jù)庫表

第一步,創(chuàng)建數(shù)據(jù)庫表writer和查看表結(jié)構(gòu),利用SQL語句:

create table writer(

wid int(10),

wno int(10),

wname varchar(20),

wsex varchar(2),

wage int(2)

第二步,向數(shù)據(jù)庫表writer插入五條數(shù)據(jù),插入后查看表里數(shù)據(jù)

第三步,利用鎖定語句鎖定數(shù)據(jù)庫表writer,利用SQL語句:

lock table writer read;

讓數(shù)據(jù)庫表只讀不能進(jìn)行寫

第四步,為了驗(yàn)證鎖定效果,可以查看數(shù)據(jù)庫表數(shù)據(jù),利用SQL語句:

select * from writer;

第五步,利用update語句對(duì)id=5進(jìn)行更新,SQL語句為:

update writer set wname = '胡思思' where id = 5;

第六步,利用unlock進(jìn)行解鎖,SQL語句為:

unlock tables;

mysql查看是否鎖表并解除鎖

一:檢查是否鎖表, 查詢進(jìn)程并殺死進(jìn)程

1) 查詢是否鎖表

show open tables where in_use 0;

2) 查詢進(jìn)程(如果您有SUPER權(quán)限,您可以看到所有線程。否則,您只能看到您自己的線程)

show processlist;

二:查看在鎖事務(wù),殺死事務(wù)對(duì)應(yīng)的線程ID

1) 查看正在鎖的事務(wù)

select * from information_schema.INNODB_LOCKS;

2) 殺死進(jìn)程id(就是[select * from information_schema.INNODB_LOCKS; ]命令的trx_mysql_thread_id列)

kill 線程ID

3) 查看等待鎖的事務(wù)

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

其它:

1) 查看服務(wù)器狀態(tài)

show status like '%lock%';

2) 查看超時(shí)時(shí)間:

show variables like '%timeout%';

文章標(biāo)題:mysql怎么結(jié)束鎖表 mysql數(shù)據(jù)庫鎖表如何解鎖
轉(zhuǎn)載來于:http://muchs.cn/article6/doeocog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、網(wǎng)站內(nèi)鏈網(wǎng)站策劃、小程序開發(fā)企業(yè)建站、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司