關於Mysql的死鎖問題(未完待續)

2021-08-08 12:18:21 字數 1423 閱讀 5908

1、mysql常見的幾種鎖:

mysql有三種鎖的級別:頁級、表級、行級。

myisam和memory儲存引擎採用的是表級鎖(table-level locking);

bdb儲存引擎採用的是頁面鎖(page-level 

locking),但也支援表級鎖;

innodb儲存引擎既支援行級鎖(row-level locking),也支援表級鎖,但預設情況下是採用行級鎖。

mysql這3種鎖的特性可大致歸納如下:

表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低。

行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。

頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般。

2.    什麼情況下會造成死鎖

死鎖是指兩個或多個事務在同一資源上互相占用,並請求加鎖時,而導致的惡性迴圈現象。當多個事務以不同順序試圖加鎖同一資源時,就會產生死鎖。任何時間,多個事務同時加鎖同一資源,一定產生死鎖。

例如,設想下列兩個事務同時處理test表:

表結構如下:

create table `test` (

`id` int(11) default null,

`name` varchar(255) default null

) engine=innodb default charset=latin1

插入資料:

insert into `test` ( `id`, `name`) values ( '1', '1111')

insert into `test` ( `id`, `name`) values ( '2', '2222')

(1)開啟第乙個命令列

首先設定本次回話為不自動提交事務:

set autocommit=0;

檢視是否關閉自動提交:

show variables like 'auto%';

查詢加鎖(悲觀鎖)  :

select * from test where id=1 for update;

(2)開啟第二個命令列:

首先設定本次回話為不自動提交事務:

set autocommit=0;

檢視是否關閉自動提交:

show variables like 'auto%'

查詢加鎖(悲觀鎖)  :

select * from test where id=2 for update;

(3) 視窗會一直轉,等待第乙個事務結束

(4)在第乙個回話使用show processlist

可以看到第二次鎖的時候一致等待第一次鎖的釋放。

(5)其他地方再去修改資料會提示

(6)在後台會看到很多程序的程序處於等待狀態

MySQL 遇到的死鎖問 MySQL 死鎖問題分析

圖4 聚簇索引和二級索引 下面分析下索引和鎖的關係。1 delete from msg where id 2 由於id是主鍵,因此直接鎖住整行記錄即可。圖52 delete from msg where token cvs 由於token是二級索引,因此首先鎖住二級索引 兩行 接著會鎖住相應主鍵所對...

關於MySQL中的死鎖

死鎖分為兩種情況,一種是死鎖,一種是鎖等待,通常我們說的mysql 死鎖 指的是鎖等待 事務1鎖定記錄a 事務2鎖定記錄b 事務1嘗試更新記錄b 這裡是鎖等待,等待事務2提交,釋放b 事務2嘗試更新記錄a 這裡是死鎖,mysql會自動檢測,並報error 1213 40001 deadlock fo...

關於dispatch sync死鎖問題

首先,我們來看下下面乙個例子 序列佇列裡同步執行緒巢狀 nslog haha dispatch queue t queue dispatch queue create test nil dispatch sync queue,nslog xxoo2 執行結果 2014 08 25 14 30 24....